【问题标题】:SQL Case() casts results as integerSQL Case() 将结果转换为整数
【发布时间】:2019-06-12 06:09:48
【问题描述】:

使用 Pervasive 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 本身工作正常。

如何告诉 Case() 返回一个字符串/varchar ?

【问题讨论】:

    标签: sql pervasive pervasive-sql


    【解决方案1】:

    如果您在整个字符串常量中使用单引号,这是否已解决?

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

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

    【讨论】:

    • 是的!这是双引号。我将其更改为单引号,效果很好。这不是我常用的数据库风格,所以我根本不习惯使用双引号
    • 值得一提:将计算的字段名称分配给与原始名称相同的问题。
    【解决方案2】:

    例如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 部分,其中 Position 是您的列名,具有 TINYINT 数据类型。您应该考虑使用与列名不同的别名。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-09
      • 1970-01-01
      • 2011-12-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多