是否有可能在where语句@Age
param中执行类似的操作?
@AGE Varchar(8)
SELECT NAME FROM TABLE WHERE
(
If @AGE='man'
then (AGE = 'man' or AGE = 'boy')
else (AGE = 'man')
)
AND City IS NULL
答案 0 :(得分: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变量是否为空。
我回答了一个非常相似的问题here。
这是WHERE子句中非常常见的技术。如果你想 在WHERE子句中应用一些“IF”逻辑,您需要做的就是添加 带有布尔AND的额外条件到它需要的部分 适用。
答案 1 :(得分:1)
执行此操作的一种方法是使用EXEC
并按If's
构建String命令。
类似的东西:
declare @t nvarchar(max)
@AGE Varchar(8)
set @t=' SELECT NAME FROM TABLE WHERE '
If @AGE='man' set @t=@t+'(AGE = ''man'' or AGE = ''boy'')'
else set @t=@t+'(AGE = 'man')'
set @t=@t+' AND City IS NULL'
答案 2 :(得分:1)
以连接正常形式(“一系列AND”,较少依赖于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;
答案 3 :(得分:0)
或者您可以使用decode functions