2017-08-14 27 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)::文本

乾杯。