我在使用CASE WHEN
语句时遇到问题,因为列是值字符串必须使用这样的等号
SELECT *
FROM table
WHERE (field = (CASE WHEN @PaidStatus = 1 THEN 'HELLO' ELSE NULL END)
但是无法将null值与等于运算符进行比较(我需要编写WHERE field IS NULL
而不是WHERE field = NULL
)。
那怎么能这样呢?
这会诀窍吗?
SELECT *
FROM table
WHERE (field = 'HELLO' AND @PaidStatus = 1)
OR (field IS NULL AND @PaidStatus <> 1)
要仅返回field =参数值的行,或者,如果参数为NULL,则返回所有行,然后:
SELECT *
FROM table
WHERE (field = @PaidStatus OR @PaidStatus IS NULL)
对于其他组合,例如参数值为1则字段等于'HELLO',或者,如果参数为null,则为所有行:
SELECT *
FROM table
WHERE ((field = 'HELLO' AND @PaidStatus = 1) OR @PaidStatus IS NULL)
小心括号,你可能会发现缩进使得它更容易理解,例如
SELECT *
FROM table
WHERE (
(field = 'HELLO' AND @PaidStatus = 1)
OR (field = 'GOODBYE' AND @PaidStatus = 2)
OR @PaidStatus IS NULL
)
使案例的语法有效吗?
一个CASE
返回一个值,可以有多个WHEN
。
因此,您可以与返回的值进行比较。
SELECT *
FROM table
WHERE
(CASE
WHEN @PaidStatus = 1 AND field = 'HELLO' THEN 1
WHEN field IS NULL THEN 2
ELSE 0
END) > 0
如果你有许多不同的标准放在CASE
,这可以很方便。
但如果它只有2,那么只使用OR
会更短。
SELECT *
FROM table
WHERE (field IS NULL OR (@PaidStatus = 1 AND field = 'HELLO'));