検索ページなどで、ユーザが検索条件を入れたとき、入れなかったときに、条件(where句)を制御する方法として、安直な方法としては、クエリを動的に作成し、if文等で、クエリにその条件を追加することで実現できる。
Stored Procedureを使っているような場合でも、Stored Procedure内で、文字列を定義し、その文字列内でwhere句を含め、クエリを完成させていく。
下記イメージ:
declare @query nvarchar(max)
set @query = 'select column1, column2 from table where 1=1 ';
if @para1 is not null
begin
set @query = @query + 'column1 = ' + @para1
end
sp_executesql @query -- @queryを実行
せっかくStored Procedureを使っていても、上記のような書き方をすると、実際にStored Procedureが実行されないと、クエリがあっているか評価ができず、開発面でも、ちょいと面倒なことが多い。
かつ、せっかくStored Procedureを使うにもかかわらず、事前に実行プランが作成されないので、Stored Procedure内で静的クエリで定義されている場合に比べ、多少なりとも処理時間が掛かる可能性がある。
せっかくStored Procedureを使用する場合は、パラメータが空であれば、条件として入れないようにする方法案として、下記のようなクエリを書くことができる。
@para1が空であれば(NULLであれば)、その後の「COLUMN1 = @para1」は、条件には当てはまらないが、ORなので、COLUMN1の条件は結局無視される。
逆に@para1が空でない(NULLでない)場合は、「@para1 is null」には当てはまらないが、「COLUMN1 = @para1」が適用され、COLUMN1=@paraでフィルタされる。
select *
from table_name
where (@para1 is null or COLUMN1 = @para1)
and (@para2 is null or COLUMN2 <= @para2)
NULL関連:
https://yo3.dev/%e3%80%90sql%e3%80%91isnull%e3%82%92stored-procedure%e3%81%aewhere%e3%81%a7%e4%bd%bf%e7%94%a8%e3%81%97%e3%81%aa%e3%81%84