Здравствуйте, Аноним, Вы писали:
А>Помогите написать процедуру:
create procedure foo(@firstName, @lastName, @age) as
begin
select * from dbo.people
where firstname like '%' + isnull(@firstname, firstname) + '%'
and lastname like '%' + isnull(@lastname, lastname) + '%'
and age = isnull(@age, age)
end
B>B>create procedure foo(@firstName, @lastName, @age) as
B>begin
B> select * from dbo.people
B> where firstname like '%' + isnull(@firstname, firstname) + '%'
B> and lastname like '%' + isnull(@lastname, lastname) + '%'
B> and age = isnull(@age, age)
B>end
B>
Вот так будет оптимальнее:
(@firstname IS NULL OR firstname LIKE '%' + @firstname + '%')
Здравствуйте, divergo, Вы писали:
D>Вот так будет оптимальнее:
D>D>(@firstname IS NULL OR firstname LIKE '%' + @firstname + '%')
D>
С какой стати это будет оптимальнее?
Здравствуйте, divergo, Вы писали:
D>Вот так будет оптимальнее:
D>D>(@firstname IS NULL OR firstname LIKE '%' + @firstname + '%')
D>
Академичность решения оставим за кадром.
Можно ведь исчо и динамический sql слепить
Или так склеить:
...
and
case
when @firstname is null then 1
when firstname like @firstname then 1
else 0
end = 1
and
case
when @age is null then 1
when age = @age then 1
else 0
end = 1
...
B>Академичность решения оставим за кадром.
Ну оно незначительно быстрее работает.
Если же там этих лайков с десяток, то профит будет ощутимый.
+
В варианте
firstname like '%' + isnull(@firstname, firstname) + '%'
firstname будет NULL, то запись не выберется.