3

我有一个表 Orders,其中包含一个名为 OrderSummary 的列。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

我有一个拆分函数,它将分隔符作为第一个输入,将字符串作为第二个输入。

我已经编写了以下查询,但出现错误。

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

声明 @mykey INT

插入 @mytemp(OrderSummary) 从 SAM_STORE_OM_Orders 中选择 OrderSummary

设置@SKUID = ''

从 @mytemp 中选择 @mykey = min( mykey )

而@mykey 不为空开始选择@SKUID = @SKUID + OrderSummary from @mytemp where mykey = @mykey select @mykey = min( mykey) from @mytemp where mykey > @mykey end

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

于 2012-12-06T10:25:03.030 回答