您可以通过几种方法来解决这个问题。要得到什么,我相信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)+'"';
你试过了吗?正则表达式?如果不是,请仔细查看以便接近解决方案。 – Robyn
SQL SERVER 2012是您在标签中提供的信息。你的问题标题没有意义。请[编辑]使其描述您提问的问题或您遇到的问题。你还没有提供任何这些信息。请访问[问],然后[编辑]以满足这些要求。 –
我已经使用Reg表达式来获取值,但是,我希望所有这些值在一个列中。 – user2771727