SQL将所有内容放在两个符号中

时间:2016-12-07 01:19:13

标签: sql sql-server

我遇到了一个问题,我必须在两个管道中提取值,任何建议都会受到赞赏。

enter image description here

2 个答案:

答案 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',' ')