2012-04-17 124 views
2

是否有可能做這樣的事情發生在這裏在where語句@Age帕拉姆?這樣做的加倍在哪裏條件

@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'and AGE ='boy')'? – 2012-04-17 07:09:40

+0

@Damien_The_Unbeliever:我不認爲這很簡單,考慮當'@AGE ='man'和'AGE ='boy''時,OP的搜索條件是TRUE,而你的是FALSE。 - – onedaywhen 2012-04-17 08:04:46

+0

@onedaywhen:爲什麼,這將是真的。首先比較產生假,第二和第三產量爲真。最後兩個的結合也產生True,並且False和True的分離又是True。 – 2012-04-17 09:37:48

回答

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」邏輯,你需要做的就是將帶有布爾AND的額外條件添加到 需要應用的部分。

1

一個方法是用EXECIf'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

或者你可以使用decode functions

+1

問題標記爲'sql-server'。 SQL Server上不存在'DECODE'。 – 2012-04-17 07:32:42

1

在合取範式(「等一系列與運算的」,較少地依賴於parans):

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;