如何在sql Server中模拟
MySQL的
CONCAT_WS()功能?
此函数类似于CONCAT()
function in SQL Server 2012,只是它在非NULL项之间添加了一个分隔符:
SELECT id,CONCAT_WS('; ',a,b,c,d) AS bar FROM foo ORDER BY id;
| ID | BAR | |----|------------| | 1 | a; b; c; d | | 2 | b; d | | 3 | a; d | | 4 | |
解决方法
我们可以使用几个技巧:
>要跳过NULL值:COALESCE()
>为避免尾随分隔符:在每个项目之前添加它,之后删除第一个项目,例如STUFF()
CREATE TABLE foo ( id INT IDENTITY(1,1) NOT NULL,a VARCHAR(50),b VARCHAR(50),c VARCHAR(50),d VARCHAR(50),PRIMARY KEY (id) ); INSERT INTO foo (a,d) VALUES ('a','b','c','d'); INSERT INTO foo (a,d) VALUES (NULL,NULL,NULL);
SELECT id,STUFF( COALESCE('; ' + a,'') + COALESCE('; ' + b,'') + COALESCE('; ' + c,'') + COALESCE('; ' + d,''),1,2,'') AS bar FROM foo ORDER BY id
| ID | BAR | |----|------------| | 1 | a; b; c; d | | 2 | b; d | | 3 | a; d | | 4 | (null) |
STUFF(…,”)的目的是删除初始分隔符(在我们的例子中,2是分隔符长度).
这应该适用于sql Server 2005(可能还有早期版本).
注意:与原始CONCAT_WS()不同,当所有项都为NULL时,我们的版本返回NULL.老实说,我认为这是一个更好的选择,但无论如何都应该很容易改变.