2017-08-14 23 views
1

从表中选择一些数据时,我希望使用CASE语句在空值的情况下返回“n/a”。PostgreSQL - 在用case语句测试整数时返回字符串

这是表的简化,但代表性的版本我看:

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)导致错误:

ERROR: invalid input syntax for integer: "n/a"
LINE 2: WHEN paid_cents IS NULL THEN 'n/a'

似乎Postgres的期待一个整数测试一个整数(和不断变化的“N/A”到一些确实时要返回的确工作)。我猜我需要CAST某处?

+0

postgres将NULL视为未知 - 也许'什么时候paid_cents IS NULL THEN NULL'将服务?..因为你不能在列中混合datatyopes - 它是以太int或字符 –

回答

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 
+0

铸造两个字符串是我需要的。非常感谢。 –

+0

当然,很乐意帮忙。 –

1

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

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

在这种情况下这将是 铸造((paid_cents/100)为文本) 代替 (paid_cents/100)::文本

干杯。