SQL:在单排串联列值到由逗号分隔的字符串(SQL: Concatenate column valu

2019-06-26 02:24发布

比方说,我有一个表像这样在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