答案 0 :(得分:1)
googlethe substring()和charIndex()函数。
表达式charIndex('||', @desc)' will return the position of the first pair of pipes, so
2 + charIndex('||',@ desc)'是你想要的第一个字符的位置(C),然后为了得到长度,我们需要减去位置从结束的位置开始。最终位置是第二对管道的charindex。为此,请使用charIndex函数的最后一个[可选]参数,该参数指定从哪里开始查找。如果将其设置为第一对管道的位置,则charindex将找到下一个(第二个)对的位置:charIndex('||', @desc, charIndex('||', @desc))
。要提取的字符串的长度是它们之间的差异,(稍微调整一下)
declare @desc varchar(max) = 'Purchased Order ||COFX123412||'
Select 2+charIndex('||', @desc), -- position of start of COFX123412
charIndex('||', @desc, charIndex('||', @desc)), -- pos of 2nd pair of pipes
2+charIndex('||', @desc))-2-charIndex('||', @desc), -- Length
substring(@desc, 2+charIndex('||', @desc),
charIndex('||', @desc, 2+charIndex('||', @desc))-
2-charIndex('||', @desc))
答案 1 :(得分:1)
借助解析/拆分功能和CROSS Apply
Declare @YourTable table (ID int,[Desc] varchar(500))
Insert Into @YourTable values
(1,'Purched Order 12345 ||COXFF6||'),
(2,'Purched Order 12345 ||COXFF6||,||COX888|| haha ||COX777||')
Select ID
,[Desc] = '||'+B.RetVal+'||'
From @YourTable A
Cross Apply (Select *
From [dbo].[udf-Str-Parse](Replace('.'+A.[Desc],' ','.'),'||')
Where RetVal not like '[.,]%'
) B
返回
ID Desc
1 ||COXFF6||
2 ||COXFF6||
2 ||COX888||
2 ||COX777||
UDF如果需要的话。 (如果不能使用UDF,逻辑可以迁移到交叉应用中)
CREATE FUNCTION [dbo].[udf-Str-Parse] (@String varchar(max),@Delimiter varchar(10))
Returns Table
As
Return (
Select RetSeq = Row_Number() over (Order By (Select null))
,RetVal = LTrim(RTrim(B.i.value('(./text())[1]', 'varchar(max)')))
From (Select x = Cast('<x>'+ Replace(@String,@Delimiter,'</x><x>')+'</x>' as xml).query('.')) as A
Cross Apply x.nodes('x') AS B(i)
);
--Select * from [dbo].[udf-Str-Parse]('Dog,Cat,House,Car',',')
--Select * from [dbo].[udf-Str-Parse]('John Cappelletti was here',' ')