32

3 つのパラメーターを持つストアド プロシージャがあるとします。すべての可能性のうち、私は、あまりにも多くWHEREを使用して制御不能になることなく、単一の句でこれを達成しようとしています...() AND () OR ()

例:

    //Params
@CITY VARCHAR(100) = NULL,
@GENDER VARCHAR(100) = NULL,
@AGE VARCHAR(100) = NULL

存在する場合は各変数に対して使用できると思いますがIF BEGIN ... END、それではコードが必要以上に長くなります..

以下のこの方法は長すぎるため機能しません (このような約 10 の異なるフィールドがありますが、例は 3 つだけです)。

SELECT NAME FROM TABLE 
WHERE (
(CITY=@CITY AND GENDER=@GENDER AND AGE=@AGE)
OR (CITY=@CITY AND GENDER=@GENDER)
OR (GENDER=@GENDER AND AGE=@AGE)
OR (CITY=@CITY AND AGE=@AGE)
OR (CITY=@CITY)
OR (GENDER=@GENDER)
OR (AGE=@AGE)
)

これを行うためのさらに短いより効率的な方法はありますか?

はいの場合、メソッドが JOIN とも互換性があることが望ましいです。

4

5 に答える 5

70

ISNULL/オプションの代わりにCOALESCE、パラメーターが null であるかどうかをテストできます。

SELECT NAME  
FROM TABLE  
WHERE  
    (@City IS NULL OR City = @City)
AND 
    (@Gender IS NULL OR Gender = @Gender)
AND 
    (@Age IS NULL OR Age = @Age) 
于 2012-04-17T05:56:58.333 に答える
18

これはどうですか?

SELECT
    NAME
FROM TABLE 
WHERE CITY = COALESCE(@CITY, CITY)
    AND GENDER = COALESCE(@GENDER, GENDER)
    AND AGE = COALESCE(@AGE, AGE)
于 2012-04-17T05:54:12.910 に答える
6

次のようなことを試してください:

SELECT NAME 
FROM TABLE 
WHERE 
    City = IsNull(@City, City) AND
    Gender = IsNull(@Gender, Gender) AND
    Age = IsNull(@Age, Age)

また:

SELECT NAME 
FROM TABLE 
WHERE 
    (City = @City OR @City IS NULL) AND
    (Gender = @Gender OR @Gender IS NULL) AND
    (Age = @Age OR @Age IS NULL)
于 2012-04-17T05:53:43.937 に答える
2
SELECT NAME   
FROM TABLE   
WHERE       
  City = case when isnull(@City ,'') = '' then City
                        else @City end
AND      
  Gender = case when isnull(@Gender ,'') = '' then Gender
                        else @Gender end
AND  
  Age = case when isnull(@Age ,0) = 0 then Age
                        else @Age end    
于 2012-04-17T06:34:31.860 に答える
1

おそらくこれ:

create procedure myProc
    --Params
@CITY VARCHAR(100) = NULL,
@GENDER VARCHAR(100) = NULL,
@AGE VARCHAR(100) = NULL
as

SELECT NAME FROM [TABLE]
WHERE ISNULL(CITY,'')=ISNULL(@CITY,ISNULL(CITY,''))
AND ISNULL(GENDER,'')=ISNULL(@GENDER,ISNULL(GENDER,''))
AND ISNULL(AGE,'')=ISNULL(@AGE,ISNULL(AGE,''))
go

WHERE 句の列が null 可能であると仮定し、ISNULL を使用して null 比較を回避します。

于 2012-04-17T05:45:49.427 に答える