2016-12-25 4 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

Вы пробовали usi регулярное выражение? Если нет, посмотрите, чтобы приблизиться к решению. – Robyn

+1

SQL SERVER 2012 - это информация, которую вы указали в тегах. Заголовок вопроса не имеет значения. Пожалуйста, отредактируйте, чтобы описать вопрос, который вы задаете, или проблему, с которой вы столкнулись. Вы не указали ни одной информации об этом. Пожалуйста, посетите [ask], а затем [edit], чтобы выполнить эти требования. –

+0

Я использовал выражения Reg, чтобы получить значения, но я хочу, чтобы все эти значения были в одном столбце. – user2771727

ответ

1

Не знаю, что вы ищете строки1

Однако, с/Split функции Разбор

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 ищет решение, которое вы могли бы сделать небольшой твик для решения Джона Cappelletti, так что это выглядит следующим образом:

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]%'; 

Обратите внимание, что самый быстрая строка «разветвитель» Я знаю для SQL 2012 + можно найти 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)+'"'; 
Смежные вопросы