代码之家  ›  专栏  ›  技术社区  ›  Stephen R

sql case()将结果强制转换为整数

  •  2
  • Stephen R  · 技术社区  · 6 年前

    使用普遍的SQL数据库,我有一个复杂的SQL select语句,其中包含以下内容:

        CASE l."Position"
            WHEN 3 THEN "PIC"
            WHEN 4 THEN "SIC"
            WHEN 22 THEN "FA"
            ELSE ''
        END AS "Position"
    

    l."Position" 以tinyint的形式存储在数据库中。显然,我试图返回一个字符串——基本上是将一个数字代码转换为一个可理解的标签。但是在那一列的结果总是 0 因为(显然)它输出的是一个整型字段,当转换为数字时,“pic”(例如)为0。如果我把它改成…

        CASE l."Position"
            WHEN 3 THEN 123
            WHEN 4 THEN 456
            WHEN 22 THEN 789
            ELSE ''
        END AS "Position"
    

    …它按预期返回三位数字,所以我知道情况本身工作正常。

    如何告诉case()返回字符串/varchar?

    2 回复  |  直到 6 年前
        1
  •  1
  •   Gordon Linoff    6 年前

    如果在整个字符串常量中使用单引号,是否可以修复此问题?

    (CASE l."Position"
         WHEN 3 THEN 'PIC'
         WHEN 4 THEN 'SIC'
         WHEN 22 THEN 'FA'
         ELSE ''
     END) AS "Position"
    

    另一种可能是您应该将新列命名为不同的名称,例如 Position_Name . 如果您在查询中选择“位置”本身,那么这两者可能会混淆。

        2
  •  0
  •   Derviş Kayımbaşıoğlu    6 年前

    例子 from the official documentation ,这似乎不会引起问题。

    SELECT last_name, first_name,
    CASE
    WHEN scholarship = 1 THEN 'Scholastic'
    WHEN citizenship <> 'United States' THEN 'Foreign Study'
    WHEN (date_of_birth >= '1960-01-01' AND date_of_birth <= '1970-01-01') THEN 'AJ-44 Funds'
    ELSE 'NONE'
    END
    AS 'Funding Program' FROM Person ORDER BY last_name
    

    其结果是问题不在case语句本身,而是在 As Position 位置是您的列名w_±th tinyint数据类型的部分。您应该考虑使用不同于列名的别名。