【问题标题】:Boolean value is not recognized when using CASE WHEN使用 CASE WHEN 时无法识别布尔值
【发布时间】:2022-10-19 14:49:21
【问题描述】:

我在雪花中使用 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';

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

【问题讨论】:

  • WHEN smoke IN ('428061000124105', '428071000124103') THEN 'smoker'
  • WHEN smoke = '428061000124105' OR smoke = '428071000124103' THEN 'smoker'
  • FROM 'db'.'schema'.'table'; 不起作用,单引号 (') 用于文字字符串,而不是分隔标识对象。
  • 什么样的价值观在history.SMOKING_STATUS?

标签: sql snowflake-cloud-data-platform


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    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);
    
    SMOKE SMOKE_TEST
    TRUE NA
    FALSE NA

    这与

    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);
    

    【讨论】:

      【解决方案3】:

      它正在考虑布尔或声明它不期望​​它。请尝试如下使用“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 smoking_status
      FROM 'db'.'schema'.'table';
      

      【讨论】:

        猜你喜欢
        • 2017-08-19
        • 1970-01-01
        • 1970-01-01
        • 2021-12-12
        • 2021-12-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-12-28
        相关资源
        最近更新 更多