在SQL中使用带有参数/变量的Case语句来检查Null值

时间:2011-11-18 22:46:47

标签: sql null case where

我正在尝试编写一个SQL Select语句,以根据通过前端的用户输入返回记录。 我想写这样的Select语句:

SELECT somefields
FROM sometable
WHERE CASE variable
         WHEN 'blank' THEN field IS NULL
         ELSE field = field
      END

基本上我要么过滤一列来查找NULL值,要么忽略过滤器并根据变量的值返回所有值。我知道CASE语句的结果不可执行但我该怎么办呢?

7 个答案:

答案 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 nullfield = '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

希望这有助于某人。