【问题标题】:What's wrong with my CASE?我的 CASE 有什么问题?
【发布时间】:2012-03-15 02:29:33
【问题描述】:

CASE WHEN table1.text IS NULL THEN table2.numbers ELSE table1.text END AS newcolumn

运行此代码时,我不断收到此错误: 错误:CASE 类型字符不同且整数无法匹配

您会认为这不会导致问题,因为我在查询中创建了一个新列。我还想指出,如果有帮助的话,我正在使用旧版本的 PostgreSQL。

【问题讨论】:

  • "你会认为这不会导致问题,因为我在我的查询中创建了一个新列" Err... 为什么你认为它不会导致问题?您希望该列具有什么类型?
  • 我猜它会变成varchar,我不是在创建一个表,它只是一个提取信息的查询。
  • 您需要CAST,正如已发布的答案所示,但您也可以缩短以使用COALESCE

标签: sql postgresql


【解决方案1】:
CASE WHEN table1.text IS NULL THEN table2.numbers::text ELSE table1.text END AS newcolumn

【讨论】:

    【解决方案2】:

    问题是您试图将 table1.text 和 table2.numbers 添加到单个列中。这两列是两种不同的数据类型。尝试关注

    CASE WHEN table1.text IS NULL THEN CAST(table2.numbers AS VARCHAR(50)) ELSE table1.text END AS newcolumn
    

    【讨论】:

      【解决方案3】:

      table2.numberstable1.text 表示的数据类型必须相同,因此在这种情况下,您需要将 CAST 的值设置为 table2.numbers

      【讨论】:

        【解决方案4】:

        试试ISNULL

        CASE WHEN ISNULL(table1.text) = 1 THEN table2.numbers ELSE table1.text END AS newcolumn
        

        【讨论】:

          【解决方案5】:

          我认为错误很明显 - CASE 语句可能使用的两列的类型不兼容。

          您为什么认为尝试使用来自不同类型的两列的值不会导致问题?您可能正在结果集中创建一个新列,但它仍然必须有一个类型并且必须匹配所有潜在值。

          在很多情况下,它可能会推断出类型,但这是有风险的,并且不一定是您希望它做出的选择,因此最好由它强制您做出决定。您需要在 CASE 语句中修改一个或其他列的类型。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2014-05-29
            • 2012-08-21
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-06-06
            • 2012-09-10
            • 2013-06-29
            相关资源
            最近更新 更多