【发布时间】:2014-01-09 21:49:28
【问题描述】:
假设我有以下内容:
SELECT *
FROM Xyz
WHERE (@a IS NULL OR a = @a) AND
(@b IS NULL OR b = @b) AND
(@c IS NULL OR c = @c)
我想要完成的是更改 WHERE 子句以以 COALESCE 的方式使用条件,其中它将使用第一个不为空的条件或条件用完。
用伪语言来说是这样的:
WHERE IF @a IS NOT NULL THEN
(
a = @a
)
ELSE IF @b IS NOT NULL THEN
(
b = @b
)
ELSE IF @c IS NOT NULL THEN
(
c = @c
)
这可能吗?
【问题讨论】:
-
您可以使用
CASE。CASE在存在聚合函数的情况下无法可靠地提供短路评估。见CASE / COALESCE won't always evaluate in textual order 和Aggregates Don't Follow the Semantics Of CASE。 -
@HABO 另请参阅dba.stackexchange.com/questions/12941/… 以了解该规则的一个有趣例外。
标签: sql-server tsql sql-server-2012