在查询声明的列并定义它时,sql如何返回所有行?

时间:2015-10-22 13:00:02

标签: sql sql-server database tsql case

这在SQL中怎么可能?

DECLARE @liststr VARCHAR(MAX)
;WITH COMMA (name)
AS
(
    SELECT 'a' 
    UNION
    SELECT 'b'
    UNION
    SELECT 'c'
    UNION
    SELECT 'd'
)
SELECT @liststr = CASE WHEN  @liststr+',' IS NULL THEN '' ELSE @liststr+',' END + name 
FROM comma

SELECT @liststr as Result

以上查询返回以下结果

+---------+
| Result  |
+---------+
| a,b,c,d |
+---------+

如果我们删除案例陈述,那么

DECLARE @liststr VARCHAR(MAX)
;WITH COMMA (name)
AS
(
    SELECT 'a' 
    UNION
    SELECT 'b'
    UNION
    SELECT 'c'
    UNION
    SELECT 'd'
)
SELECT @liststr = @liststr+',' + name FROM comma
SELECT @liststr as Result

结果是

+--------+
| Result |
+--------+
| NULL   |
+--------+

2 个答案:

答案 0 :(得分:4)

完全没有。当SQL Server将字符串连接到NULL值时,值为NULL

如果先将值设置为空字符串,则两者都将返回相同的值:

DECLARE @liststr VARCHAR(MAX);
SET @liststr = '';

两个注释:

  • 使用union all而不是union,除非您明确要承担删除重复项的开销。
  • 运行查询时,结果按任意顺序排列。如果您需要特定订单,请使用order by

请注意,Erland Sommarskog表示不支持这种组合字符串的方法。虽然他建议在这个特定的答案中使用光标,但我会使用XML。

答案 1 :(得分:2)

您可以使用SQL Server的scope: {}功能:

CONCAT

因此,如果CONCAT中的一个参数为NULL,则它将替换为空字符串。