2016-12-25 54 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)+'"'; 
相關問題