sql - 连接声明的列并定义它时,sql如何返回所有行?

标签 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 |
+---------+

如果我们删除 case 语句。

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   |
+--------+

最佳答案

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

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

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

两个注意事项:

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

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

关于sql - 连接声明的列并定义它时,sql如何返回所有行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33281664/

相关文章:

sql - 比较多边形几何类型的最快方法

MySQL JOIN ON 与变量不匹配的两列之一

linux - Teradata SLES Linux 服务器上的内存使用情况

java使用hibernate SQLQuery获取多个列

MySQL LEFT JOIN 在连接表上使用 MAX 和 GROUP BY 并获取与一列的 MAX 值相对应的其他列?

mysql - 比较一列数据后更新一列数据

sql-server - SQL Server Tuning Advisor - 语句不引用任何表

sql-server - SQL Server 空间查找剩余距离

java - 从数据库序列中获取下一个值

mysql - 操作失败: There was an error while applying the SQL script to the database. MYSQL