在 SQL 中与 NULL 值连接

Posted

技术标签:

【中文标题】在 SQL 中与 NULL 值连接【英文标题】:Concatenate with NULL values in SQL 【发布时间】:2012-01-04 05:55:12 【问题描述】:
Column1      Column2
-------      -------
 apple        juice
 water        melon
 banana
 red          berry       

我有一个有两列的表。 Column1 有一组单词,Column2 也有一组单词。我想用 + 运算符连接它们,没有空格。

例如:苹果汁

问题是,如果第二列中有空值,我只想将第一个元素作为结果。

例如:香蕉

Result
------
applejuice
watermelon
banana
redberry

但是,当我使用 column1 + column2 时,如果 Comunm2 为 NULL,它会给出一个 NULL 值。我想要“香蕉”作为结果。

【问题讨论】:

我发现的不仅仅是字符串。我不知道它是否最有效,但您始终可以将列包装在 isNull 语句中。即: isNull(column1, '') + isNull(column2,'') 当它找到 null 时,它会用空字符串替换它。我尚未对此进行测试,因此请告诉我它是否有效。 SQL Server String Concatenation with Null的可能重复 【参考方案1】:

使用 COALESCE 函数将 NULL 值替换为空字符串。

SELECT Column1 + COALESCE(Column2, '') AS Result
    FROM YourTable

【讨论】:

【参考方案2】:

我不确定您将什么用作数据库,但我会为您的特定 SQL 方言寻找“合并”函数并使用它。

【讨论】:

【参考方案3】:

默认情况下,TSQL 中用于连接的 + 符号会将字符串 + null 组合为 null 作为未知值。

你可以做两件事之一,你可以改变这个控制 Sql 应该对 Nulls 做什么的会话变量

http://msdn.microsoft.com/en-us/library/ms176056.aspx

或者您可以在连接之前将每一列合并为一个空字符串。

COALESCE(Column1, '')

http://msdn.microsoft.com/en-us/library/ms190349.aspx

【讨论】:

【参考方案4】:

标准 SQL 要求包含 NULL 的字符串连接生成 NULL 输出,但这是使用 || 操作编写的:

SELECT a || b
  FROM SomeTable;

如果ab 或两者都包含NULL,则输出将为null。

使用+ 连接字符串表示您正在使用特定于DBMS 的扩展。行为可能与标准要求的相同 - 实际上,这似乎是您问题的要点。

一些 DBMS - 特别是 Oracle - 倾向于将空字符串视为等同于空字符串;然后你可以愉快地连接起来。但是,如果使用 || 运算符,则该行为并非严格符合标准。

考虑在连接之前使用 COALESCE 或 NVL 或 IFNULL 或一些类似的函数将 NULL 映射到空字符串。

【讨论】:

【参考方案5】:

如果您使用的是 MySq,请使用 ifnull(Column2, '')

【讨论】:

【参考方案6】:

你可以做一个union:

(SELECT Column1 + Column2 FROM Table1 WHERE Column2 is not NULL)
UNION
(SELECT Column1 FROM Table1 WHERE Column2 is NULL);

【讨论】:

【参考方案7】:

你可以使用case条件:

case when column_2 is not null 
     then concatenate
     else column_1
end

【讨论】:

这不会为其他 6 个现有答案添加任何有用的东西 @Adam,实际上还没有人建议将 case 表达式作为解决方案。我觉得你的评价可能太苛刻了。【参考方案8】:

我发布的一些贴有 MSSQL 的帖子已被版主重命名为“SQL”。所以我假设你使用的是 MSSQL

COALESCE 将返回第一个非空值。

SELECT COALESCE('a', NULL, 'c')

只会返回'a'

如果您想要 Firstname + Lastname,有时其中一个或另一个为 NULL,请使用 CONCAT。 Concat 将字符串加在一起,并将 NULLS 替换为 0 长度的非空值。

 SELECT CONCAT('a', NULL, 'c')

将返回“ac”

如果你想要 Fn 空间 + 中间名空间 + LN,将 concatinate 与 CONCAT 结合起来:

SELECT CONCAT('a' + ' ', NULL + ' ', 'c')

将返回“a c”。

middlename (null) 后面的空格用 + 和 NULL 消除。

NULL + ' ' 为空。

因此,在 Middlename 或 Firstname 为 null 的情况下,您不会得到多余的不需要的空格。

【讨论】:

这太完美了!我必须在字段上执行 RTRIM(LTRIM(x)),然后我做了一个 case 语句来检查连接的最后一个字符是否是我使用的分隔符 (;) 所以我可以去掉它,以防万一最后还有一个。

以上是关于在 SQL 中与 NULL 值连接的主要内容,如果未能解决你的问题,请参考以下文章

在 java 中与 MS Access 数据库建立 SQL 连接时找不到合适的驱动程序

SQL中的左连接与右连接,内连接有啥区别

在java中与数据库连接的技术是啥

SQL 语句连接

SQL 连接返回 null

java中与MS Access的连接[重复]