PostgreSQL - 使用case语句测试整数时返回字符串

时间:2017-08-14 14:44:46

标签: sql postgresql conditional case

当从表中选择一些数据时,我想使用CASE语句在空值的情况下返回“n / a”。

这是我正在查看的表的简化但有代表性的版本:

CREATE TABLE test (
    id INTEGER NOT NULL,
    paid_cents INTEGER NULL DEFAULT NULL,
    PRIMARY KEY (id)
);

INSERT INTO test VALUES (1, 100);
INSERT INTO test VALUES (2, NULL);
INSERT INTO test VALUES (3, 0);

我希望能够使用以下查询:

SELECT CASE
    WHEN paid_cents IS NULL THEN 'n/a'
    ELSE paid_cents / 100
    END AS "dollar amount"
FROM test

A fiddle的行为完全符合我的预期。但是,在我的真实数据库(PostgreSQL 9.4)上尝试此操作会导致错误:

  

错误:整数的输入语法无效:“n / a”
  第2行:WHEN paid_cents为NULL,然后'n / a'

似乎Postgres期望在测试整数时返回一个整数(并且将'n / a'更改为数字确实有效)。我猜我需要CAST某个地方?

2 个答案:

答案 0 :(得分:2)

使用NULL

SELECT CASE
    WHEN paid_cents IS NULL THEN NULL
    ELSE paid_cents / 100
    END AS "dollar amount"
FROM test

或将两者都投射到字符串:

SELECT CASE
    WHEN paid_cents IS NULL THEN 'n/a'
    ELSE (paid_cents / 100)::text
    END AS "dollar amount"
FROM test

答案 1 :(得分:1)

您不能在列中混合数据类型。如前面的答案建议你应该去一个文本数据类型(char / varchar / text等...)

我会使用ANSI-SQL和强制转换(表达式作为数据类型)而不是:: datatype。相同的功能,但可以在大多数数据库引擎之间移植。

在这种情况下,它会 cast((paid_cents / 100)as text) 代替 (paid_cents / 100):: text

干杯。