2016-03-07 122 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;