SQL Case()将结果转换为整数

时间:2019-01-18 00:22:02

标签: sql pervasive pervasive-sql

使用普及型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?

2 个答案:

答案 0 :(得分:1)

如果您始终在字符串常量中使用单引号,是否可以解决此问题?

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

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

答案 1 :(得分:0)

示例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数据类型的列名。您应该考虑使用与列名不同的别名。