从单行中动态提取多个文本 - SQL
Dynamic extraction of multiple text from a single row - SQL
table 中的值采用以下格式
Returns Request for Order: 121212, RA Number:1654356, 4 Products:, 1 x "ABC" (11169595), Expected Action: Replace, 1 x "FGH" (11449119), Expected Action: Refund, 1 x "XCV" (11100873), Expected Action: Refund, 1 x "VVV" (11028561), Expected Action: Refund
-------------------------------------------------------------------------------------------------------------------------------
Returns Request for Order: 234354, RA Number:3465646, 3 Products:, 3 x "FGH" (11449119), Expected Action: Replace
-----------------------------------------------------------------------------------------------------
Returns Request for Order: 234355, RA Number:3465646, 3 Products:, 2 x "ABC" (11169595), Expected Action: Replace, 1 x "FGH" (11449119), Expected Action: Refund
以下是想要的o/p格式:
Order_Num REFUND_PRODUCTS REPLACE_PRODUCTS
121212 11449119,11100873,11028561 11169595
234354 11449119,11449119,11449119
234355 11449119 11169595,11169595
如果其“2 x "ABC" (11169595) 预期操作:REPLACE”,则在 REPLACE_PRODUCT 列下,数字 11169595' 应出现两次。
如果它是“3 x ....”,那么三次。 REFUND_PRODUCT
类似
我该怎么做?
好的,只要您的格式保持一致,您就可以使用子字符串和找到的函数的修改版本 here。我在这里创建了一个快速计数 table,但如果您已经有一个计数或数字 table 可以使用,您可以将其换掉。
正如肖恩在评论中提到的,如果这是一个大 table,这将需要一段时间才能 运行。我不认为真的有什么办法可以解决这个问题,因为这是一个切断字符串的练习。
Declare @mytable as table (mydata varchar(4000))
Declare @myresults as table (order_num int, refund_products varchar(1000), replace_products varchar(1000))
declare @tally as table (t_idx int)
insert into @tally
select 1 UNION ALL
select 2 UNION ALL
select 3 UNION ALL
select 4 UNION ALL
select 5 UNION ALL
select 6 UNION ALL
select 7 UNION ALL
select 8 UNION ALL
select 9
INSERT INTO @mytable
Select 'Returns Request for Order: 121212 RA Number:1654356 4 Products: 1 x "ABC" (11169595) Expected Action: REPLACE 1 x "FGH" (11449119) Expected Action: REFUND 1 x "XCV" (11100873) Expected Action: REFUND 1 x "VVV" (11028561) Expected Action: REFUND' UNION ALL
Select 'Returns Request for Order: 234354 RA Number:3465646 3 Products: 3 x "FGH" (11449119) Expected Action: REPLACE' UNION ALL
Select 'Returns Request for Order: 234355 RA Number:3465646 3 Products: 2 x "ABC" (11169595) Expected Action: REPLACE 1 x "FGH" (11449119) Expected Action: REFUND'
insert into @myresults
Select
substring(mydata,charindex('Order:',mydata, 0)+7,6),
substring(
STUFF(
(Select ',' + pos_string from dbo.FindPatternLocation(mydata,'(') FOR XML PATH('')),1,1,'' ) ,10,500),
STUFF(
(Select ',' + substring(mydata ,charindex('(',mydata,0)+1,8) from @tally where t_idx<=substring(mydata,charindex('(',mydata,0)-10,1) FOR XML PATH('')),1,1,''
)
from @mytable
Select * from @myresults
函数:
CREATE FUNCTION dbo.FindPatternLocation
(
@string NVARCHAR(MAX),
@term NVARCHAR(255)
)
RETURNS TABLE
AS
RETURN
(
SELECT pos = Number - LEN(@term) ,
substring(@string, Number - LEN(@term)+1, 8) as pos_string
FROM (SELECT Number, Item = LTRIM(RTRIM(SUBSTRING(@string, Number,
CHARINDEX(@term, @string + @term, Number) - Number)))
FROM (SELECT ROW_NUMBER() OVER (ORDER BY [object_id])
FROM sys.all_objects) AS n(Number)
WHERE Number > 1 AND Number <= CONVERT(INT, LEN(@string)+1)
AND SUBSTRING(@term + @string, Number, LEN(@term)) = @term
) AS y);
作为函数的替代方法,您可以将其用作第二列:-
substring(
STUFF(
(Select ',' + pos_string from
(SELECT pos = Number - LEN('(') ,
substring(mydata, Number - LEN('(')+1, 8) as pos_string
FROM (SELECT Number, Item = LTRIM(RTRIM(SUBSTRING(mydata, Number,
CHARINDEX('(', mydata + '(', Number) - Number)))
FROM (SELECT ROW_NUMBER() OVER (ORDER BY [object_id])
FROM sys.all_objects) AS n(Number)
WHERE Number > 1 AND Number <= CONVERT(INT, LEN(mydata)+1)
AND SUBSTRING('(' + mydata, Number, LEN('(')) = '('
) aa) bb FOR XML PATH('')),1,1,'' ) ,10,500)
table 中的值采用以下格式
Returns Request for Order: 121212, RA Number:1654356, 4 Products:, 1 x "ABC" (11169595), Expected Action: Replace, 1 x "FGH" (11449119), Expected Action: Refund, 1 x "XCV" (11100873), Expected Action: Refund, 1 x "VVV" (11028561), Expected Action: Refund
-------------------------------------------------------------------------------------------------------------------------------
Returns Request for Order: 234354, RA Number:3465646, 3 Products:, 3 x "FGH" (11449119), Expected Action: Replace
-----------------------------------------------------------------------------------------------------
Returns Request for Order: 234355, RA Number:3465646, 3 Products:, 2 x "ABC" (11169595), Expected Action: Replace, 1 x "FGH" (11449119), Expected Action: Refund
以下是想要的o/p格式:
Order_Num REFUND_PRODUCTS REPLACE_PRODUCTS
121212 11449119,11100873,11028561 11169595
234354 11449119,11449119,11449119
234355 11449119 11169595,11169595
如果其“2 x "ABC" (11169595) 预期操作:REPLACE”,则在 REPLACE_PRODUCT 列下,数字 11169595' 应出现两次。
如果它是“3 x ....”,那么三次。 REFUND_PRODUCT
类似我该怎么做?
好的,只要您的格式保持一致,您就可以使用子字符串和找到的函数的修改版本 here。我在这里创建了一个快速计数 table,但如果您已经有一个计数或数字 table 可以使用,您可以将其换掉。
正如肖恩在评论中提到的,如果这是一个大 table,这将需要一段时间才能 运行。我不认为真的有什么办法可以解决这个问题,因为这是一个切断字符串的练习。
Declare @mytable as table (mydata varchar(4000))
Declare @myresults as table (order_num int, refund_products varchar(1000), replace_products varchar(1000))
declare @tally as table (t_idx int)
insert into @tally
select 1 UNION ALL
select 2 UNION ALL
select 3 UNION ALL
select 4 UNION ALL
select 5 UNION ALL
select 6 UNION ALL
select 7 UNION ALL
select 8 UNION ALL
select 9
INSERT INTO @mytable
Select 'Returns Request for Order: 121212 RA Number:1654356 4 Products: 1 x "ABC" (11169595) Expected Action: REPLACE 1 x "FGH" (11449119) Expected Action: REFUND 1 x "XCV" (11100873) Expected Action: REFUND 1 x "VVV" (11028561) Expected Action: REFUND' UNION ALL
Select 'Returns Request for Order: 234354 RA Number:3465646 3 Products: 3 x "FGH" (11449119) Expected Action: REPLACE' UNION ALL
Select 'Returns Request for Order: 234355 RA Number:3465646 3 Products: 2 x "ABC" (11169595) Expected Action: REPLACE 1 x "FGH" (11449119) Expected Action: REFUND'
insert into @myresults
Select
substring(mydata,charindex('Order:',mydata, 0)+7,6),
substring(
STUFF(
(Select ',' + pos_string from dbo.FindPatternLocation(mydata,'(') FOR XML PATH('')),1,1,'' ) ,10,500),
STUFF(
(Select ',' + substring(mydata ,charindex('(',mydata,0)+1,8) from @tally where t_idx<=substring(mydata,charindex('(',mydata,0)-10,1) FOR XML PATH('')),1,1,''
)
from @mytable
Select * from @myresults
函数:
CREATE FUNCTION dbo.FindPatternLocation
(
@string NVARCHAR(MAX),
@term NVARCHAR(255)
)
RETURNS TABLE
AS
RETURN
(
SELECT pos = Number - LEN(@term) ,
substring(@string, Number - LEN(@term)+1, 8) as pos_string
FROM (SELECT Number, Item = LTRIM(RTRIM(SUBSTRING(@string, Number,
CHARINDEX(@term, @string + @term, Number) - Number)))
FROM (SELECT ROW_NUMBER() OVER (ORDER BY [object_id])
FROM sys.all_objects) AS n(Number)
WHERE Number > 1 AND Number <= CONVERT(INT, LEN(@string)+1)
AND SUBSTRING(@term + @string, Number, LEN(@term)) = @term
) AS y);
作为函数的替代方法,您可以将其用作第二列:-
substring(
STUFF(
(Select ',' + pos_string from
(SELECT pos = Number - LEN('(') ,
substring(mydata, Number - LEN('(')+1, 8) as pos_string
FROM (SELECT Number, Item = LTRIM(RTRIM(SUBSTRING(mydata, Number,
CHARINDEX('(', mydata + '(', Number) - Number)))
FROM (SELECT ROW_NUMBER() OVER (ORDER BY [object_id])
FROM sys.all_objects) AS n(Number)
WHERE Number > 1 AND Number <= CONVERT(INT, LEN(mydata)+1)
AND SUBSTRING('(' + mydata, Number, LEN('(')) = '('
) aa) bb FOR XML PATH('')),1,1,'' ) ,10,500)