我有一个表(pf1)和一个具有数据的列(comment)。我需要获取ReqNumber。
行示例
CLIA::;ReqNum:1234567890:;PrfLab::;LabDep::;CtrlId::; Auth:NOT REQUIRED:
我需要在单独的列中获取1234567890。
谢谢。
对于此要求,我在这里看到了很多矫kill过正。如果只是简单地获取字符串中的前10位数字,则可以执行以下操作:
当reqnum始终为10位数字时:
SELECT Item = SUBSTRING(@string,f.Pos,10)
FROM (VALUES(PATINDEX('%'+REPLICATE('[0-9]',10)+'%', @string))) AS f(Pos);
使用NGrams8K(对于类似这样的东西以及更多东西很有用),您可以执行以下操作:
SELECT TOP (1) ng.Token
FROM samd.NGrams8K(@string,10) AS ng
WHERE PATINDEX('%[^0-9]%',ng.Token) = 0
ORDER BY ng.Position;
假设reqnum是可变长度,例如8到12位数长:
第一种技术更简单,第二种效率更高:
DECLARE @string VARCHAR(8000) =
'CLIA::;ReqNum:1234567890:;PrfLab::;LabDep::;CtrlId::; Auth:NOT REQUIRED:';
-- Technique #1
SELECT SUBSTRING(@string,MAX(f.Pos),MAX(n.Rng))
FROM (VALUES(12),(11),(10),(9),(8)) AS n(Rng)
CROSS APPLY (VALUES(PATINDEX('%'+REPLICATE('[0-9]',n.Rng)+'%', @string))) AS f(Pos)
WHERE f.Pos > 0;
-- Technique #2 (Better)
SELECT SUBSTRING(ns.Txt,1,f2.Pos)
FROM (VALUES(PATINDEX('%'+REPLICATE('[0-9]',8)+'%',@string))) AS f(Pos)
CROSS APPLY (VALUES(SUBSTRING(@string,f.Pos,12))) AS ns(Txt)
CROSS APPLY (VALUES(PATINDEX('%[^0-9]%',ns.Txt)-1)) AS f2(Pos)
当reqnum为任意长度并且假设字符串中只有一个数字序列时
该解决方案使用N-Grams拆分字符串。您可以为此使用delimitedSplit8k。
SELECT TOP (1)
ItemIndex = ng.Position+1,
Item = f.Item
FROM samd.ngrams8k(@string,1) AS ng
CROSS APPLY (VALUES(CHARINDEX(':',@string,ng.Position+1))) AS nxt(Pos)
CROSS APPLY (VALUES(SUBSTRING(@string,ng.Position+1,nxt.Pos-ng.Position-1))) AS f(Item)
WHERE ng.Token = ':' AND PATINDEX('%[^0-9]%',f.Item)<PATINDEX('%[0-9]%',f.Item);
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句