在 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;
如果a
或b
或两者都包含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 值连接的主要内容,如果未能解决你的问题,请参考以下文章