【问题标题】:Sql Server Where Case Then Is Null Else Is Not NullSql Server where case then 为空,否则不为空
【发布时间】:2010-12-21 14:30:16
【问题描述】:

我有一个程序接收一个名为@FL_FINALIZADA 的位变量。

如果它是 null 或 false,我想限制我的选择只显示包含 null DT_FINALIZACAO 值的行。否则我想显示不包含 DT_FINALIZACAO 值的行。

类似这样的:

SELECT 
    * 
FROM 
    MyTable 
WHERE 
    ...
    AND
    (
        OPE.DT_FINALIZACAO = (
            CASE
                WHEN (@FL_FINALIZADA <> 1)
                    THEN NULL
                END
        ) OR 
        OPE.DT_FINALIZACAO IS NOT NULL
    )

在这种情况下,我收到消息:

a 中没有结果表达式 CASE 规范可以是NULL

我怎样才能做到这一点?

提前致谢。

【问题讨论】:

  • 我不知道为什么在这个例子中你需要 case 语句。

标签: sql sql-server stored-procedures case


【解决方案1】:
SELECT 
    * 
FROM 
    MyTable 
WHERE
    (ISNULL(@FL_FINALIZADA, 0) = 0
     AND
     OPE.DT_FINALIZACAO IS NULL
     )
     OR
     (@FL_FINALIZADA = 1
      AND
      OPE.DT_FINALIZACAO IS NOT NULL
     )

【讨论】:

  • 即使您传递NULLFALSE,也会显示非空值。
  • 不知何故与我最近的回答有关 :-) stackoverflow.com/questions/4495974/…
  • 我在错误的方向上花了几个小时后得到了类似的东西。还是谢谢。
【解决方案2】:

将 AND 更改为:

AND (((@FL_FINALIZADA <> 1) AND (OPE.DT_FINALIZACAO IS NULL)) OR ( (@FL_FINALIZADA = 1) AND (OPE.DT_FINALIZACAO IS NOT NULL)))

如果位标志为 1,则 DT_FINALIZACAO 不能为空。

【讨论】:

  • 当@FL_FINALIZADA 为0时,这将返回空值和非值
  • 是一个NULL被传递,查询会返回一个空结果集
【解决方案3】:
IF @FL_FINALIZADA IS NULL
    SET @FL_FINALIZADA = 0

SELECT * FROM NewsletterSubscribers 
WHERE
   (@FL_FINALIZADA = 0 AND OPE.DT_FINALIZACAO IS NULL) 
   OR 
   (@FL_FINALIZADA = 1 AND OPE.DT_FINALIZACAO IS NOT NULL)

【讨论】:

    【解决方案4】:

    我的详细 SQL 有点生疏了,但是你试过用 NULL 的 0 insted 吗?我希望 0 在该选择中评估与 NULL 相同

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-21
      • 2012-01-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多