比方说,我有一个表像这样在SQL Server中:
Id City Province Country
1 Vancouver British Columbia Canada
2 New York null null
3 null Adama null
4 null null France
5 Winnepeg Manitoba null
6 null Quebec Canada
7 Seattle null USA
我怎样才能得到的查询结果,这样的位置是市,省的串联,并通过国家“”隔开,省略空值。 我想,以确保没有任何尾随的逗号,逗号前面,或空字符串。 例如:
Id Location
1 Vancouver, British Columbia, Canada
2 New York
3 Adama
4 France
5 Winnepeg, Manitoba
6 Quebec, Canada
7 Seattle, USA
Answer 1:
我觉得这个通吃的我在其他的答案发现问题的照顾。 无需测试输出的长度或检查开头的字符是一个逗号,没有关于串联非字符串类型,复杂性没有显著上升时,不可避免地增加了其他的列(如邮编)担心...
DECLARE @x TABLE(Id INT, City VARCHAR(32), Province VARCHAR(32), Country VARCHAR(32));
INSERT @x(Id, City, Province, Country) VALUES
(1,'Vancouver','British Columbia','Canada'),
(2,'New York' , null , null ),
(3, null ,'Adama' , null ),
(4, null , null ,'France'),
(5,'Winnepeg' ,'Manitoba' , null ),
(6, null ,'Quebec' ,'Canada'),
(7,'Seattle' , null ,'USA' );
SELECT Id, Location = STUFF(
COALESCE(', ' + RTRIM(City), '')
+ COALESCE(', ' + RTRIM(Province), '')
+ COALESCE(', ' + RTRIM(Country), '')
, 1, 2, '')
FROM @x;
SQL Server 2012中添加一个新的名为T-SQL函数CONCAT
,但在这里是没有用的,因为你还是有选择地包括发现值之间的逗号,也没有工具来做到这一点-它只是不带选项munges值加在一起一个分隔符。 这样就不必担心非字符串类型,但不允许你处理空值与非零点非常典雅。
Answer 2:
select Id ,
Coalesce( City + ',' +Province + ',' + Country,
City+ ',' + Province,
Province + ',' + Country,
City+ ',' + Country,
City,
Province,
Country
) as location
from table
Answer 3:
这是一个难题,因为逗号必须去在两者之间:
select id, coalesce(city+', ', '')+coalesce(province+', ', '')+coalesce(country, '')
from t
似乎像它应该工作,但我们可以得到一个最后的外来逗号,如当国家为空。 因此,它需要更复杂一些:
select id,
(case when right(val, 2) = ', ' then left(val, len(val) - 1)
else val
end) as val
from (select id, coalesce(city+', ', '')+coalesce(province+', ', '')+coalesce(country, '') as val
from t
) t
没有很多的中间逻辑的,我认为最简单的方法是将一个逗号添加到每个元件,并且然后在最后除去任何多余的逗号。
Answer 4:
使用“+”操作符。
记者了解到,空值不与“+”运算工作(因此,例如:“温尼伯” +空= NULL),所以一定要使用ISNULL()或者COALESCE()函数来代替空值与空字符串,例如:ISNULL( '温尼伯', '')+ ISNULL(空, '')。
另外,如果是甚至远程可能是您的collumns的一个可以被解释为一个数字,那么就一定要使用CAST()函数为好,以避免错误再次出现,例如:CAST(“温尼伯”为varchar( 100))。
大多数的例子至今忽视这一块或多块。 另外 - 一些例子使用子查询或者做一个长度检查,你真的不应该做的事情 - 只是没有必要的 - 但如果你做你的优化可能会节省你的好意。
祝好运
Answer 5:
丑陋,但它会为MS SQL工作:
select
id,
case
when right(rtrim(coalesce(city + ', ','') + coalesce(province + ', ','') + coalesce(country,'')),1)=',' then left(rtrim(coalesce(city + ', ','') + coalesce(province + ', ','') + coalesce(country,'')),LEN(rtrim(coalesce(city + ', ','') + coalesce(province + ', ','') + coalesce(country,'')))-1)
else rtrim(coalesce(city + ', ','') + coalesce(province + ', ','') + coalesce(country,''))
end
from
table
Answer 6:
下面是一个选项:
SELECT (CASE WHEN City IS NULL THEN '' ELSE City + ', ' END) +
(CASE WHEN Province IS NULL THEN '' ELSE Province + ', ' END) +
(CASE WHEN Country IS NULL THEN '' ELSE Country END) AS LOCATION
FROM MYTABLE
文章来源: SQL: Concatenate column values in a single row into a string separated by comma