我正在尝试编写一个SQL Select语句,以根据通过前端的用户输入返回记录。 我想写这样的Select语句:
SELECT somefields
FROM sometable
WHERE CASE variable
WHEN 'blank' THEN field IS NULL
ELSE field = field
END
基本上我要么过滤一列来查找NULL值,要么忽略过滤器并根据变量的值返回所有值。我知道CASE语句的结果不可执行但我该怎么办呢?
答案 0 :(得分:3)
当variable
为“空白”时,以下查询将为您提供field
为NULL的行。当variable
是其他任何内容时,它会为您提供所有行:
SELECT somefields
FROM sometable
WHERE
(variable = 'blank' AND field IS NULL)
OR (variable <> 'blank')
答案 1 :(得分:2)
您可以使用NULLIF()
(链接用于SQL Server,但NULLIF()
应该是标准的):
SELECT somefields
FROM sometable
WHERE field = NULLIF(variable, 'blank')
答案 2 :(得分:2)
以下代码段的行为如下:
@variable is null
时,返回所有行@variable = 'blank'
时,返回field is null
或field = 'blank'
@variable
等于field
代码段:
WHERE 1 = CASE
WHEN @variable is null then 1
WHEN @variable = 'blank' and field is null then 1
WHEN @variable = field then 1
END
答案 3 :(得分:1)
SELECT somefields
FROM sometable
WHERE ((variable IS NULL OR variable = 0) OR (variable = field))
当变量具有值
时,应用标准
例如:
DECLARE @CityName VARCHAR(50)
SET @CityName = NULL
SELECT CityName
FROM City
WHERE ((@CityName IS NULL ) OR (@CityName = CityName ))
当City为null时,表将返回所有行
答案 4 :(得分:0)
我想我得到了你想要的东西。这样的事可能吗?
SELECT field1,
field2,
CASE variable
WHEN 'blank' THEN NULL
ELSE field3
END as field3
FROM sometable
答案 5 :(得分:0)
想想我明白你的意思......例如....
SELECT
House, Postcode
from
SomeTable
where
(House=isnull(@House,House) or (House is null and @House is null))
and
(Postcode=isnull(@Postcode,Postcode) or (Postcode is null and @Postcode is null))
条件的第一位是使用变量,如果存在(isnull位是忽略变量,如果它为null)
条件的第二位,如果你的评价字段为空,那么有效字段不是= null它们是'空'。
困惑?好。按照我正在做的事情工作!
答案 6 :(得分:0)
以下是基于@Andomar上述答案的解决方案,针对任何测试输入varchar值的人,您需要按照以下示例以正确的顺序测试参数:
FIELD1 = CASE
WHEN @inputParameter = '' THEN FIELD1
WHEN @inputParameter <> FIELD1 THEN NULL -- if input is some text but does not match
WHEN @inputParameter IS NULL THEN FIELD1
WHEN @inputParameter != '' AND FIELD1 = @inputParameter THEN FIELD1
END
希望这有助于某人。