2016-03-07 82 views
1

我有一个需求,我需要在SQL表中选择一列到两个单独的包含逗号分隔值的字段中 - 一个应该被引用,另一个应该不带引号。例如,如果表的值在单个列中具有值abcde,那么我的选择SQL语句应该返回两个字段 - 一个字段包含值'a','b','c','d', 'e',另一个包含值a,b,c,d,e。T-SQL中带引号和不带引号的逗号分隔列表

我运行下面的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 

不过,我有一个场景,对结果“援引”和“不带引号的”一栏是即使我运行相同的不同SUBSTRING函数中的“SELECT”语句。

什么是实现我想要的最佳方式?

有没有办法编写一个SQL语句,使其仅查询表一次,并重复使用两列的结果,而不是两次运行“SELECT”语句。

回答

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;