PostgreSQL - 使用 case 语句测试整数时的 return 字符串
PostgreSQL - return string when testing integer with case statement
从 table 中选择一些数据时,如果出现空值,我想使用 CASE
语句 return "n/a"。
这是 table 我正在查看的简化但具有代表性的版本:
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 期望在测试整数时对整数进行 returned(并且将 'n/a' 更改为数字确实有效)。我猜我需要 CAST
某个地方?
或者使用 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
您不能在列中混合使用数据类型。正如之前的回答所建议的那样,您应该使用文本数据类型(char/varchar/text 等...)
我会使用 ANSI-SQL 和转换(表达式作为数据类型)而不是 :: 数据类型。相同的功能,但可以在大多数数据库引擎之间移植。
在这种情况下
cast( (paid_cents/100) 作为文本)
代替
(paid_cents/100):: 文本
干杯。
从 table 中选择一些数据时,如果出现空值,我想使用 CASE
语句 return "n/a"。
这是 table 我正在查看的简化但具有代表性的版本:
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 期望在测试整数时对整数进行 returned(并且将 'n/a' 更改为数字确实有效)。我猜我需要 CAST
某个地方?
或者使用 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
您不能在列中混合使用数据类型。正如之前的回答所建议的那样,您应该使用文本数据类型(char/varchar/text 等...)
我会使用 ANSI-SQL 和转换(表达式作为数据类型)而不是 :: 数据类型。相同的功能,但可以在大多数数据库引擎之间移植。
在这种情况下 cast( (paid_cents/100) 作为文本) 代替 (paid_cents/100):: 文本
干杯。