3

OrderSummaryという名前の列を含むOrdersテーブルがあります。OrderSummaryには、次の形式のデータがあります

123,0,0,0,0,0|223,1,1,1,1,1|323,2,2,2,2,2|423,3,3,3,3,3|523,4,4,4,4,4|

|ここで、区切り文字の後の最初の数値を取得したいと思いました。つまり、出力を次のようにします。

123
223
323
423
523

区切り文字を最初の入力として、文字列を2番目の入力として受け取る分割関数があります。

次のクエリを作成しましたが、エラーが発生します。

SELECT SUBSTRING(T.Value,1,CHARINDEX(',',T.Value)-1) 
 FROM (
    Select * 
    FROM Split('|',(
         SELECT OrderSummary 
         FROM SAM_STORE_OM_Orders 
         GROUP BY OrderSummary)))
    T

サブクエリは複数の行を返すことができます。

SELECT OrderSummary FROM SAM_STORE_OM_Orders GROUP BY OrderSummary
4

3 に答える 3

2

してみてください:

SELECT SUBSTRING(T.Value,1,CHARINDEX(',',T.Value)-1) FROM
    (SELECT VALUE FROM SAM_STORE_OM_Orders CROSS APPLY Split('|', OrderSummary)
)T
于 2012-12-06T07:33:05.913 に答える
1

申し訳ありませんが、私はあなたの機能を使用しません;)

;WITH cte (OrderSummaryXML) AS
 (  
  SELECT CAST('<r>' + REPLACE(SUBSTRING(OrderSummary, 1, LEN(OrderSummary)-1), '|', '</r><r>') + '</r>' AS XML)
  FROM SAM_STORE_OM_Orders
  GROUP BY OrderSummary 
  )
SELECT SUBSTRING(OrderSummary, 0, CHARINDEX(',', OrderSummary))
FROM cte
  CROSS APPLY (SELECT Tbl.Col.value('.', 'nvarchar(250)') AS OrderSummary
               FROM OrderSummaryXML.nodes('/r') Tbl(Col)) AS List

SQLFiddle のデモ

于 2012-12-06T07:46:18.950 に答える
0

私はすでに解決策の回避策を確立していますが、あなたの返信に感謝します..私が確立した回避策は DECLARE @SKUID Varchar(MAX) です

DECLARE @mytemp Table(mykey INT IDENTITY(1,1),OrderSummary Varchar(MAX))

DECLARE @mykey INT

INSERT INTO @mytemp(OrderSummary) SAM_STORE_OM_Orders から OrderSummary を選択

SET @SKUID = ''

@mytemp から @mykey = min( mykey ) を選択

@mykey が null でない間 @mytemp から @SKUID = @SKUID + OrderSummary を選択開始 mykey = @mykey @mytemp から @mykey = min( mykey ) を選択 mykey > @mykey end

SELECT SUBSTRING(T.Value,1,CHARINDEX(',',T.Value)-1) FROM ( Select * FROM Split('|',@SKUID) )T

于 2012-12-06T10:25:03.030 に答える