web-dev-qa-db-ja.com

パラメータがnullの場合、SQLはWHEREの一部を無視します

4つのパラメーターに基づいてテーブルから情報を取得するストアドプロシージャがあります。

パラメーターに基づいて値を取得したいのですが、パラメーターがNULLの場合、そのパラメーターはチェックされません。 4つのパラメーターがすべてnullの場合、テーブル全体が表示されます。

これは私のSP(ご覧のとおり、これは1つのパラメーターatmでのみ機能します):

CREATE PROCEDURE myProcedure
    @Param1 nvarchar(50),
    @Param2 nvarchar(50),
    @Param3 nvarchar(50),
    @Param4 nvarchar(50)
AS
BEGIN
    IF(@Param1 IS NULL)
        BEGIN
            SELECT Id, col1, col2, col3, col4 FROM myTable
        END
    ELSE
        BEGIN
            SELECT Id, col1, col2, col3, col4 FROM myTable WHERE col1 LIKE @Param1+'%'
        END
END

これを行う方法はありますかなし可能なすべての組み合わせ(15 IF)にIFを使用しますか?

23

のようなものはどうですか

SELECT Id, col1, col2, col3, col4 
FROM    myTable 
WHERE   col1 LIKE @Param1+'%'
OR      @Param1 IS NULL

この特定のケースでは、使用することもできます

SELECT Id, col1, col2, col3, col4 
FROM    myTable 
WHERE   col1 LIKE ISNULL(@Param1,'')+'%'

しかし、一般的にあなたは次のようなものを試すことができます

SELECT Id, col1, col2, col3, col4 
FROM    myTable 
WHERE   (condition1 OR @Param1 IS NULL)
AND     (condition2 OR @Param2 IS NULL)
AND     (condition3 OR @Param3 IS NULL)
...
AND     (conditionN OR @ParamN IS NULL)
41
Adriaan Stander

@ param1がcol1のパラメーターであるということを意味する場合、@ param2はcol2のパラメーターです...などこれを試すことができます。

CREATE PROCEDURE myProcedure
@Param1 nvarchar(50),
@Param2 nvarchar(50),
@Param3 nvarchar(50),
@Param4 nvarchar(50)
AS
BEGIN
declare @query nvarchar(4000)
SET @query='SELECT Id, col1, col2, col3, col4 FROM myTable '+
    (case when ((@Param1 is null) and (@Param2 is null) and (@Param3 is null) and (@Param4 is null))
    then ''
    else
        'where '+
        (case when @Param1 is not null
        then ' col1 like '''+@param1+'%'''+
            (case when @param2 is not null then ' AND ' else '' end)
        else '' end)+
        (case when @Param2 is not null
        then ' col2 like '''+@param2+'%'''+
            (case when @param3 is not null then ' AND ' else '' end)
        else '' end)+
        (case when @Param3 is not null
        then ' col3 like '''+@param3+'%'''+
            (case when @param4 is not null then ' AND ' else '' end)
        else '' end)+
        (case when @Param4 is not null
        then ' col4 like '''+@param4+'%'''
        else '' end)
    end)

exec sp_sqlexec @query
3
Fauzi88
CREATE PROCEDURE myProcedure
    @Param1 nvarchar(50),
    @Param2 nvarchar(50),
    @Param3 nvarchar(50),
    @Param4 nvarchar(50)
AS
BEGIN
    IF(@Param1 IS NULL)
        BEGIN
            SELECT Id, col1, col2, col3, col4 FROM myTable
        END
    ELSE
        BEGIN
            SELECT Id, col1, col2, col3, col4 FROM myTable WHERE col1 LIKE @Param1+'%' OR @Param1 is Null
        END
END

これは役立つはずです

よろしく

アシュトシュアリヤ

3
Ashutosh Arya

SQLサーバーでuse COALESCE()関数を使用できます。ステートメントでIF- ElseまたはCASEを使用する必要はありません。 COALESCEfunctionの使用方法は次のとおりです。

SELECT Id, col1, col2, col3, col4 FROM myTable where col1 = COALESCE(NULLIF(@param1, ''), col1) and col2 = COALESCE(NULLIF(@param2, ''), col2) and col3 = COALESCE(NULLIF(@param3, ''), col3) and col4=
COALESCE(NULLIF(@param4, ''), col4)

SQLのCOALESCE関数は、引数の中で最初の非NULL式を返します。ここで、たとえば@ param1がnullに等しい場合、関数はcol1を返します。これは、条件が常に真であることを意味する1 = 1のようなwhereステートメントでcol1 = col1になります。

2
Aamir

どこに条件を追加し、CASE .. WHEN .. THEN..

次の方法を試してください。

select col1,col2,...colN..from Table 
Where clm1 = CASE WHEN @PARAMETER = 0 THEN **COL1** ELSE **@PARAMETER** 

条件として同じ列名を設定した後、テーブルから条件値に基づいてパラメータとして渡す場合は、テーブルからすべてのデータを取得します。

0
Mayur