是否有可能做這樣的事情發生在這裏在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
是否有可能做這樣的事情發生在這裏在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
是的,是這樣的:
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的額外條件添加到 需要應用的部分。
一個方法是用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'
在合取範式(「等一系列與運算的」,較少地依賴於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;
'AGE ='man'OR(@ AGE ='MAN'and AGE ='boy')'? – 2012-04-17 07:09:40
@Damien_The_Unbeliever:我不認爲這很簡單,考慮當'@AGE ='man'和'AGE ='boy''時,OP的搜索條件是TRUE,而你的是FALSE。 - – onedaywhen 2012-04-17 08:04:46
@onedaywhen:爲什麼,這將是真的。首先比較產生假,第二和第三產量爲真。最後兩個的結合也產生True,並且False和True的分離又是True。 – 2012-04-17 09:37:48