将两个数据库列合并为一个结果集列。

47
我使用以下SQL将一个表中的多个数据库列连接成结果集中的一列: SELECT (field1 + '' + field2 + '' + field3) FROM table1 当其中一个字段为空时,整个字符串连接表达式的结果为null。有什么方法可以解决这个问题吗?
此数据库为MS SQL Server 2008。顺便问一下,这是连接数据库列的最佳方式吗?是否有任何标准的SQL来执行此操作?
7个回答

46

标准的SQL做法如下:

SELECT COALESCE(field1, '') || COALESCE(field2, '') || COALESCE(field3, '') FROM table1

示例:

INSERT INTO table1 VALUES ('hello', null, 'world');
SELECT COALESCE(field1, '') || COALESCE(field2, '') || COALESCE(field3, '') FROM table1;

helloworld

8
@Steve 双竖线是什么意思?对于 SQL Server 来说,不应该直接使用 + 吗? - rsbarro
1
"||" 是 SQL 标准的字符串连接运算符。问题是“是否有标准的 SQL 可以做到这一点?”,我正在回答这个问题。也许 OP 想问“是否有任何纯 SQL 的方法来做到这一点?” - Steve Prentice
4
@Adrian,不仅仅是Oracle。许多关系型数据库遵循这里的标准。当你在陌生的关系型数据库上尝试执行“string + string”操作时失败时,了解此信息会很有帮助。其中一个很好的例子是迄今为止最广泛使用的数据库:sqlite3。 (每个iPhone和Android设备上都在使用) - Steve Prentice
@jilt3d,|| 在更多的数据库上可以工作,但是正如你在 http://troels.arvin.dk/db/rdbms/#functions-concat 上看到的那样,这里有很多不兼容性。 - Steve Prentice
5
该问题标记为 sql-server-2008 - 在 SQL Server 中使用 || 运算符不能有效地拼接字符串。 - BornToCode
显示剩余3条评论

38

如果您使用的是SQL 2012或更高版本,则可以使用CONCAT函数:

SELECT CONCAT(field1, field2, field3) FROM table1

NULL字段不会破坏你的连接。

@bummi - 感谢评论 - 我编辑了我的答案来对应它。


4
问题涉及SQL Server 2008,CONCAT函数是在SQL Server 2012中引入的。 - bummi

14

NULL的正常行为是对包括NULL在内的任何操作都会产生NULL结果...

- 9 * NULL  = NULL  
- NULL + '' = NULL  
- etc  

使用 ISNULL 或 COALESCE 来替换任何出现的 NULL 值,以克服此问题。

SELECT (ISNULL(field1,'') + '' + ISNULL(field2,'') + '' + ISNULL(field3,'')) FROM table1

5

4
使用ISNULL来解决这个问题。
示例:
SELECT (ISNULL(field1, '') + '' + ISNULL(field2, '')+ '' + ISNULL(field3, '')) FROM table1

这将用空字符串替换您的NULL内容,这将保留连接操作,使其不会被评估为整体的NULL结果。

1

如果两列都是数字,则使用以下代码:

将列强制转换为Varchar(Size)

示例:

Select (Cast(Col1 as Varchar(20)) + '-' + Cast(Col2 as Varchar(20))) As Col3 from Table

1

将列转换为varchar(大小)。

如果两个列都是数字,则使用以下代码。

示例:

Select (Cast(Col1 as Varchar(20)) + '-' + Cast(Col2 as Varchar(20))) As Col3 from Table

“col3”的大小将是多少?它将是40还是其他值?”

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接