2012-04-17 16 views
2

whereステートメント@Age paramで何が起きているのかは可能ですか?これを行うためのWHERE条件の倍増

@AGE Varchar(8) 

SELECT NAME FROM TABLE WHERE 
(
If @AGE='man' 
    then (AGE = 'man' or AGE = 'boy') 
    else (AGE = 'man') 
) 
AND City IS NULL 
+4

'AGE = 'man' OR(@ AGE = 'MAN'とAGE = 'boy')'? –

+0

@Damien_The_Unbeliever:私はそれがそれほど単純ではないと思います。 '@AGE = 'man''と' AGE =' boy''のときOPの検索条件はTRUEで、あなたのものはFALSEであると考えてください。 - – onedaywhen

+0

@onedaywhen:なぜ、それは本当でしょうか。最初の比較ではFalse、2番目、3番目のTrueを返します。最後の2つの論理積も真であり、FalseとTrueの論理和は真である。 –

答えて

2

はい、このような何か:

SELECT NAME FROM TABLE WHERE 
((@AGE='man' 
    AND (AGE = 'man' or AGE = 'boy')) 
OR 
(@AGE <> 'man' 
    AND (AGE = 'man'))) 
AND City IS NULL 

条件@AGE <> 'man'が@AGE変数がnullになることができるかどうかに応じて微調整する必要がある場合があります。

私は非常によく似た質問hereに答えました。

これは、WHERE節でよく使用される手法です。 WHERE句にいくつかの "IF"ロジックを適用するには、 を追加する必要があります。

1

一つの方法は、EXECであるとIf'sによって文字列のコマンドを構築します。このような

何か:

declare @t nvarchar(max) 
@AGE Varchar(8) 
set @t=' SELECT NAME FROM TABLE WHERE ' 


If @AGE='man' set @[email protected]+'(AGE = ''man'' or AGE = ''boy'')' 
    else set @[email protected]+'(AGE = 'man')' 

set @[email protected]+' AND City IS NULL' 
0

か、連言標準形(paransにあまり依存「の論理積のシリーズ」、)でdecode functions

+1

質問は 'sql-server'タグが付けられています。 DECODEはSQL Server上に存在しません。 –

1

を使用することができます。ここでの考え方は、含意書き換えルールを使用することです

SELECT * 
    FROM TABLE 
WHERE (@AGE <> 'man' OR (AGE IN ('man', 'boy'))) 
     AND (@AGE = 'man' OR AGE = 'man') 
     AND CITY IS NULL; 

(IF x THEN y) is equivalent to (NOT (x) OR y) 

ここでのいくつかのテストコード:

WITH T 
    AS 
    (
     SELECT * 
     FROM (
       VALUES (1, 'man', NULL), 
        (2, 'boy', NULL), 
        (3, 'girl', NULL) 
      ) AS T (NAME, AGE, CITY) 
    ), 
    Params 
    AS 
    (
     SELECT * 
     FROM (
       VALUES ('man'), 
        ('boy'), 
        ('girl') 
      ) AS T (p_AGE) 
    ), 
    Results 
    AS 
    (
     SELECT Params.*, T.*, 
      CASE WHEN  ((p_AGE <> 'man' OR (AGE IN ('man', 'boy'))) AND (p_AGE = 'man' OR AGE = 'man')) THEN 'TRUE' 
        WHEN NOT ((p_AGE <> 'man' OR (AGE IN ('man', 'boy'))) AND (p_AGE = 'man' OR AGE = 'man')) THEN 'FALSE' 
        ELSE 'UNKNOWN' 
      END AS result_onedaywhen, 
      CASE WHEN  (AGE='man' OR (p_AGE='MAN' and AGE='boy')) THEN 'TRUE' 
        WHEN NOT (AGE='man' OR (p_AGE='MAN' and AGE='boy')) THEN 'FALSE' 
        ELSE 'UNKNOWN' 
      END AS result_Damien_The_Unbeliever 
     FROM T, Params 
    ) 
SELECT * 
    FROM Results;