SQL在连接中使用If Not Null

Bis*_*kie 12 sql null concatenation

如果我有桌子

在此输入图像描述

SELECT (Firstname || '-' || Middlename || '-' || Surname)  AS example_column
FROM example_table
Run Code Online (Sandbox Code Playgroud)

这将显示Firstname-Middlename-Surname例如

John--Smith
Jane-Anne-Smith
Run Code Online (Sandbox Code Playgroud)

第二个(Jane's)显示正确,但是由于John没有中间名,我希望它忽略第二个破折号.

我怎么能放入一个IF Middlename = NULL语句,以便只显示John-Smith

And*_*lfe 20

这是我的建议:

PostgreSQL和其他SQL数据库在哪里'a' || NULL IS NULL:

SELECT firstname || COALESCE('-' || middlename, '') || '-' || surname ...
Run Code Online (Sandbox Code Playgroud)

Oracle和其他SQL数据库在哪里'a' || NULL = 'a':

SELECT first name || DECODE(middlename, NULL, '', '-' || middlename) || '-' || surname...
Run Code Online (Sandbox Code Playgroud)

我喜欢简洁.对于任何维护程序员来说,中间名是否为空都不是很有趣.CASE开关非常好,但它们很笨重.我想尽可能避免重复相同的列名("中间名").

正如@Prdp所指出的那样,答案是特定于RDBMS的.具体的是服务器是否将零长度字符串视为等效NULL,这决定了连接a是否NULL产生a NULL.

COALESCE对于PostgreSQL风格的空字符串处理,以及DECODE (*VALUE*, NULL, ''...Oracle 风格的空字符串处理,通常最为简洁.


a_h*_*ame 11

如果您使用Postgres,concat_ws()那么您正在寻找:

SELECT concat_ws('-', Firstname, Middlename, Surname)  AS example_column
FROM example_table
Run Code Online (Sandbox Code Playgroud)

SQLFiddle:http://sqlfiddle.com/#!15/9eecb7db59d16c80417c72d1e1f4fbf1/8812

要处理仅包含NULL使用空格的空字符串或字符串nullif():

 SELECT concat_ws('-', Firstname, nullif(trim(Middlename), ''), Surname)  AS example_column
 FROM example_table
Run Code Online (Sandbox Code Playgroud)

  • @MichaelBuen:不会。`concat_ws()` 会处理这个问题。 (2认同)