T-SQL中带引号和未带引号的逗号分隔列表

时间:2016-03-07 04:18:06

标签: sql-server

我需要在SQL表中选择一个列到两个包含逗号分隔值的单独字段中 - 一个应该引用,另一个应该不引用。

因此,例如,如果表在单个列中具有值abcde,则我的select SQL语句应返回两个字段 - 一个字段包含值' a'' b' ' C'' d'' E'另一个包含值a,b,c,d,e。

我正在运行以下SQL语句来实现此目的:

SELECT 
    SUBSTRING((SELECT TOP 100 ''',''' + CAST(sales_id AS NVARCHAR(50)) 
               FROM sales_order_header 
               WHERE (status = 0) 
               ORDER BY updated_datetime, 1 
               FOR XML PATH('')),3,2147483647) + '''' AS quoted, 
    SUBSTRING((SELECT TOP 100 ',' + CAST(sales_id AS NVARCHAR(50)) 
               FROM sales_order_header 
               WHERE (status = 0) 
               ORDER BY updated_datetime, 1 
               FOR XML PATH('')),2,2147483647) + '' AS unquoted

然而,我有一个场景,其结果为"引用"和"未引用的"虽然我运行相同的" SELECT" SUBSTRING函数中的语句。

达到我想要的最佳方式是什么?

有没有办法编写一个SQL语句,以便它只查询一次表并重新使用两列的结果,而不是运行" SELECT"声明两次。

1 个答案:

答案 0 :(得分:0)

通过在CTE或派生表中构建基本查询,可以避免重复复制查询。假设sales_id是数字,可以通过替换引号来实现从引用版本构建未引用版本:

WITH MyCte(Col) AS
(
    SELECT TOP 100 ''',''' + CAST(sales_id AS NVARCHAR(50))
        FROM sales_order_header 
        WHERE (status = 0) 
        ORDER BY updated_datetime, 1 FOR XML PATH('')
)
SELECT SUBSTRING(Col, 3,2147483647) + '''' AS quoted, 
       SUBSTRING(Replace(Col, '''', ''),2,2147483647) + '' AS unquoted
FROM MyCte;