我的select语句中有一个非常大的大小写,以1或0结尾,并且别名为“x”。我想在我的WHERE语句中检查“x”是否为1,但我知道别名不能在where语句中使用。检查此条件的唯一方法是在WHERE子句中包含原始case语句吗?
答案 0 :(得分:2)
您可以使用CROSS/OUTER APPLY
:
SELECT *
FROM tab t
CROSS APPLY (SELECT CASE WHEN t.col ... THEN
-- very complex conditions
END
) sub(c)
WHERE sub.c = ?;
此方法允许您避免嵌套子查询。
答案 1 :(得分:2)
您可以将您的陈述放在cte:
中; with CTE as (Select .... as X from ...)
Select *
from CTE
where X = 1
答案 2 :(得分:2)
怎么样更简单?你的case表达式有点回归。在我看来,如果你需要一个where子句,就不需要多次运行case表达式。
select MyReturn = 1
from SomeTable
where case with a whole bunch of logic end = 1
或者如果您需要将其参数化为此类。
select MyReturn = @MyBit
from SomeTable
where case with a whole bunch of logic end = @MyBit
答案 3 :(得分:1)
没有子查询工作得很好吗?
SELECT ST.*
FROM (SELECT TBL.*,
CASE WHEN ComplexCondition THEN 'Something'
ELSE 'SomethingElse'
END AS aliasedColumn
FROM SomeTable
) ST
WHERE ST.aliasedColumn = 'Something';