【问题标题】:PostgreSQL - return string when testing integer with case statementPostgreSQL - 使用 case 语句测试整数时返回字符串
【发布时间】:2018-01-22 10:45:19
【问题描述】:

当从表中选择一些数据时,我想使用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 行:当paid_cents 为 NULL THEN 'n/a'

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

【问题讨论】:

  • postgres 将 NULL 视为未知 - 也许 WHEN paid_cents IS NULL THEN NULL 会服务?.. 因为你不能在列中混合数据类型 - 它是 ether int 或 char

标签: sql postgresql conditional case


【解决方案1】:

要么使用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

【讨论】:

  • 我需要将两者都转换为字符串。非常感谢。
  • 当然,很高兴为您提供帮助。
【解决方案2】:

您不能在列中混合数据类型。正如之前的回答所建议的,您应该使用文本数据类型(char/varchar/text 等...)

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

在这种情况下 cast( (paid_cents/100) 作为文本) 代替 (paid_cents/100) :: 文字

干杯。

【讨论】:

    猜你喜欢
    • 2020-10-14
    • 1970-01-01
    • 1970-01-01
    • 2016-12-18
    • 2013-01-09
    • 1970-01-01
    • 1970-01-01
    • 2017-01-08
    • 1970-01-01
    相关资源
    最近更新 更多