PostgreSQL连接多个案例会导致结果为null

时间:2017-09-20 13:33:53

标签: sql postgresql

我对PostgreSQL很新。下一个查询在Oracle中有效但在PSQL中不起作用:

select case 1 when null then null else 1||' ' end ||
       case 2 when null then null else 2||' ' end ||
       case 3 when null then null else 3 end as total
from   numbers

如果1和2不为null但只有3为null,则尽管1 en 2不为null且total的结果不应为null,但total的结果将为null。

最终结果应该是当3列中的一列不为null时,total不应为null。这可能吗?

1 个答案:

答案 0 :(得分:2)

对于Postgres - 与Oracle不同 - 空字符串''null是两个不同的东西。在Oracle中,带有null的字符串连接将null值视为空字符串。但是,当您在Oracle中存储空字符串('')时,它会将其视为null值。

在SQL中,定义了所有(或几乎所有)运算符,如果任何参数为null,则结果也为null,例如42 + null'foo'||null

同样case 1 when null毫无意义。 1永远不会null,因此永远不会执行when部分。此外,您无法以这种方式测试null。您需要使用is null,但不能使用缩写的case语法。

你可能想写这样的东西:

select case when first_column is null then '' else first_column||' ' end ||
       case when second_column is null then '' else second_column||' ' end ||
       case when third_column is null null then '' else third_column end as total
from   numbers

但是,您可以使用coalesce()

轻松完成此操作
select coalesce(first_column, '')||' '||coalesce(second_column, '')||' '||coalesce(third_column, '')

或使用concat()将null视为空字符串:

select concat(first_column, ' ', second_column, ' ', third_column)

甚至更简单地使用concat_ws()“concat with separator”:

select concat_ws(' ', first_column, second_column, third_column)

concat_ws()会将分隔符(第一个参数)放在其他参数的每个值之间,但会正确处理null值和空字符串,以使分隔符在两个值之间不会出现两次。

concat('one', ' ', null, ' ', '')返回'one '
但是concat_ws(' ', 'one', null, '')会返回'one'