首页 > 解决方案 > 基于 SQL CASE WHEN 或 IIF 反转布尔值

问题描述

我正在尝试根据 MSSQL (MSSQL Server 2017) 中的设置条件反转布尔列

我曾尝试使用 IIF 和 CASE WHEN,但遇到了一些语法错误。

方法一:IIF

SELECT
    IIF(Completed_Date > @EndDate AND Completed = 'True', --Conditions
    Completed = 'False', Completed) 
AS 
    Completed_Filter

方法 2:CASE WHEN

CASE WHEN 
    Completed_Date > @EndDate AND Completed = 'True'
THEN 
    Completed = 'False'
ELSE 
    Completed END
AS 
    Completed_Filter

列字段的数据类型为:[COMPLETED] [bit] NULL。

运行一个简单的过滤器查询 SELECT * FROM TABLE WHERE Completed != 'False'不会产生任何错误,即布尔列可以正常工作。

但是,我很困惑为什么上述 2 个代码片段会导致语法错误,这种错误发生在等号处Completed = 'False'

如果没有,我希望将布尔值从 to 反转'True''False'如果Completed_Date > @EndDate不是,就让 Completed 布尔值保持原样。

非常感谢任何帮助,谢谢

标签: sqlsql-servertsql

解决方案


你这样做是不对的

SELECT
    IIF(Completed_Date > @EndDate AND Completed = 'True', --Conditions
        'False', 
        Completed
        ) 
AS 
    Completed_Filter

这与

SELECT CASE WHEN Completed_Date > @EndDate AND Completed = 'True'
            THEN 'False'
            ELSE Completed
       END Completed_Filter

从文档IIF()

返回两个值之一,具体取决于布尔表达式在 SQL Server 中的计算结果是真还是假。

您的布尔表达式是Completed_Date > @EndDate AND Completed = 'True',如果满足此条件,则返回第一个,否则返回第二个值。

当您检查时没有问题'True'/'False'aBIT因为它是有效的,字符串值True并且False可以转换为位值, 1 是'True'0 是'False'

问题是Completed = 'False'原因IIF()CASE应该返回一个值,而不是布尔表达式。

查看CASE表达式和IIF()函数,您甚至可以在其中找到一些提供的示例。


推荐阅读