使用 CASE WHEN 时无法识别布尔值

我在雪花中使用 SQL。我正在尝试使用 CASE WHEN 来开发吸烟状况的指标。当我运行代码时,我得到一个错误:

无法识别布尔值“428061000124105”。

我正在使用的代码是:

SELECT 
  history.PATIENT_ID as pat,
  history.SMOKING_STATUS AS smoke,
 CASE
  WHEN smoke = '428061000124105' OR '428071000124103' THEN 'smoker'
  WHEN smoke = '8517006' THEN 'ex_smoker'
ELSE 'NA'
END AS smoking_status
FROM 'db'.'schema'.'table';

这是数据问题吗?解决这个问题的最佳方法是什么?

stack overflow Boolean value is not recognized when using CASE WHEN
原文答案

答案:

作者头像

由于您仅在 when 条件下提供列名,因此 SQL Server 将其解释为布尔值。

请尝试将其更改为 WHEN smoke = '428061000124105' OR smoke = '428071000124103' THEN 'smoker'

作者头像

这可能显示错误发生的原因:

SELECT column1 as smoke
    ,CASE 
        WHEN smoke = '1234' THEN 'booleans are equal to text represntations of numbers'
        ELSE 'NA'
    END as smoke_test
FROM VALUES (true), (false);

给出:

无法识别布尔值“1234”

这就是说,“你有一个布尔值”(也就是只有真或假),你正在将它与一个字符串进行比较。不要那样做。

如果您坚持将“真”或“假”与文本数字进行比较。您可以将布尔值转换为 TEXT

SELECT column1 as smoke
    ,CASE 
        WHEN smoke::text = '1234' THEN 'booleans are equal to text represntations of numbers'
        WHEN smoke::text = '1' THEN 'one'
        WHEN smoke::text = '0' THEN 'zero'
        ELSE 'NA'
    END as smoke_test
FROM VALUES (true), (false);
烟雾 烟雾测试
真的 不适用
错误 不适用

这与

SELECT column1 as smoke
    ,'NA'as smoke_test
FROM VALUES (true), (false);

或者您可以将 bool 转换为 INT ,此时 TEXT 和 NUMBER 比较将在转换 BOOL 后自动转换为 TEXT 所以 null,0,1

SELECT column1 as smoke
    ,CASE 
        WHEN smoke::int = '1234' THEN 'booleans are equal to text represntations of numbers'
        WHEN smoke::int = '1' THEN 'one'
        WHEN smoke::int = '0' THEN 'zero'
        ELSE 'NA'
    END as smoke_test
FROM VALUES (true), (false), (null);
作者头像

它正在考虑它不期望的 Boolean OR 语句。请尝试如下使用'IN'

SELECT history.PATIENT_ID as pat, history.SMOKING_STATUS AS smoke, CASE WHEN Smoke in ('428061000124105','428071000124103') THEN 'smoker' WHEN Smoke = '8517006' THEN 'ex_smoker' ELSE 'NA' END AS吸烟状态来自'db'.'schema'.'table';