2016-12-25 69 views
-7

字符串1取特定值:我想从一个字符串

{cm_documentation_.chk_phone_call_physician}=1 & 
{cm_documentation_.txt_phone_call_code}="99441" & 
({cm_documentation_.txt_units_mins}!="" & ({local.units_mins}<5 | 
{local.units_mins}>10) | {cm_documentation_.txt_units_mins}="") 

字符串2:

{@This}="93015" | {@This}="78454" | {@This}="78453" | {@This}="78452" | 
{@This}="78451" | {@This}="78480" | {@This}="78478" | {@This}="78465" | 
{@This}="78499" | {@This}="78492" | {@This}="78491" | {@This}="78459" 

欲后=符号

Result: 
99441 
93015 
78454 
78453 

抓取值。 。 。 。 。 。 。 等等.....

+0

你试过了吗?正则表达式?如果不是,请仔细查看以便接近解决方案。 – Robyn

+1

SQL SERVER 2012是您在标签中提供的信息。你的问题标题没有意义。请[编辑]使其描述您提问的问题或您遇到的问题。你还没有提供任何这些信息。请访问[问],然后[编辑]以满足这些要求。 –

+0

我已经使用Reg表达式来获取值,但是,我希望所有这些值在一个列中。 – user2771727

回答

1

不知道你在找什么String1中

然而,随着解析/分割功能

Declare @String2 varchar(max) = '{@This}="93015" | {@This}="78454" | {@This}="78453" | {@This}="78452" | 
{@This}="78451" | {@This}="78480" | {@This}="78478" | {@This}="78465" | 
{@This}="78499" | {@This}="78492" | {@This}="78491" | {@This}="78459" ' 

Select RetSeq 
     ,RetVal=Replace(Substring(RetVal,PatIndex('%[0-9]%',RetVal),25),'"','') 
From [dbo].[udf-Str-Parse](@String2,'|') 

返回

RetSeq RetVal 
1  93015 
2  78454 
3  78453 
4  78452 
5  78451 
6  78480 
7  78478 
8  78465 
9  78499 
10  78492 
11  78491 
12  78459 

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((Select @String as [*] For XML Path('')),@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',' ') 
--Select * from [dbo].[udf-Str-Parse]('this,is,<test>,for,< & >',',') 
0

您可以通过几种方法来解决这个问题。要得到什么,我相信OP正在寻找解决方案,你可以做点小约翰·卡佩莱蒂的解决方案,以便它看起来像这样:

DECLARE 
@string1 varchar(1000) = 
'{cm_documentation_.chk_phone_call_physician}=1 & 
{cm_documentation_.txt_phone_call_code}="99441" & 
({cm_documentation_.txt_units_mins}!="" & ({local.units_mins}<5 | 
{local.units_mins}>10) | {cm_documentation_.txt_units_mins}="")', 

@string2 varchar(1000) = 
'{@This}="93015" | {@This}="78454" | {@This}="78453" | {@This}="78452" | 
{@This}="78451" | {@This}="78480" | {@This}="78478" | {@This}="78465" | 
{@This}="78499" | {@This}="78492" | {@This}="78491" | {@This}="78459"'; 

Select RetVal 
From [dbo].[udf-Str-Parse](@string1 + @string2,'"') 
where RetVal NOT LIKE '%[^0-9]%'; 

需要注意的是最快的字符串的“分流”据我所知,2012年SQL +可以找到here

另一种选择是使用PatternSplitCM,你可以得到here。而做到这一点:

DECLARE 
@string1 varchar(1000) = 
'{cm_documentation_.chk_phone_call_physician}=1 & 
{cm_documentation_.txt_phone_call_code}="99441" & 
({cm_documentation_.txt_units_mins}!="" & ({local.units_mins}<5 | 
{local.units_mins}>10) | {cm_documentation_.txt_units_mins}="")', 

@string2 varchar(1000) = 
'{@This}="93015" | {@This}="78454" | {@This}="78453" | {@This}="78452" | 
{@This}="78451" | {@This}="78480" | {@This}="78478" | {@This}="78465" | 
{@This}="78499" | {@This}="78492" | {@This}="78491" | {@This}="78459"'; 

SELECT item = REPLACE(item,'"','') 
FROM dbo.PatternSplitCM(@string1 + @string2,'[0-9"]') 
WHERE matched = 1 
AND item LIKE '"[0-9]%"'; 

现在,如果你你一直在寻找这种模式([0-9] =数字):=“[0-9] [0-9] [0-9] [0-9] [0-9]”以最快的方式会是这样使用NGrams8K这样的:

DECLARE 
@string1 varchar(1000) = 
'{cm_documentation_.chk_phone_call_physician}=1 & 
{cm_documentation_.txt_phone_call_code}="99441" & 
({cm_documentation_.txt_units_mins}!="" & ({local.units_mins}<5 | 
{local.units_mins}>10) | {cm_documentation_.txt_units_mins}="")', 

@string2 varchar(1000) = 
'{@This}="93015" | {@This}="78454" | {@This}="78453" | {@This}="78452" | 
{@This}="78451" | {@This}="78480" | {@This}="78478" | {@This}="78465" | 
{@This}="78499" | {@This}="78492" | {@This}="78491" | {@This}="78459"'; 

SELECT token = SUBSTRING(token,3,5) 
FROM dbo.NGrams8K(@string1 + @string2,8) 
WHERE token LIKE '="[0-9][0-9][0-9][0-9][0-9]"'; 

或者,假设你知道你在解析出了,说的数字,3〜5字符长 - 你可以这样做NGrams8K像这样:

DECLARE 
@string1 varchar(1000) = 
'{cm_documentation_.chk_phone_call_physician}=1 & 
{cm_documentation_.txt_phone_call_code}="99441" & 
({cm_documentation_.txt_units_mins}!="" & ({local.units_mins}<5 | 
{local.units_mins}>10) | {cm_documentation_.txt_units_mins}="")', 

@string2 varchar(1000) = 
'{@This}="9301" | {@This}="78454" | {@This}="78453" | {@This}="78452" | 
{@This}="784514" | {@This}="78480" | {@This}="78478" | {@This}="78465" | 
{@This}="78499" | {@This}="78492" | {@This}="78491" | {@This}="78459"'; 

SELECT token = SUBSTRING(token, 3, stringlen) 
FROM (VALUES (4),(5),(6)) s(stringlen) 
CROSS APPLY dbo.NGrams8K(@[email protected], stringlen+3) 
WHERE token LIKE '="'+REPLICATE('[0-9]',stringlen)+'"'; 
相关问题