Sql 需要从Sting中提取整数
我有一个列,它是字符串和整数的混合体Sql 需要从Sting中提取整数,sql,tsql,wildcard,Sql,Tsql,Wildcard,我有一个列,它是字符串和整数的混合体 E.g DQ1-12987, DQQ-12367, DS18768, AS-10383B 我只需要从列中提取整数,但是如果数据在“之前有整数”,我不想考虑这个整数。< /P> e.g DQ1-12987 should be 12987 or DQQ-12387 should be as 12387 我正在使用下面的代码,但这并没有给我正确的结果 Create Function dbo.GetNumbers(@Data VarChar(8000)) Re
E.g DQ1-12987, DQQ-12367, DS18768, AS-10383B
我只需要从列中提取整数,但是如果数据在“之前有整数”,我不想考虑这个整数。< /P>
e.g DQ1-12987 should be 12987 or DQQ-12387 should be as 12387
我正在使用下面的代码,但这并没有给我正确的结果
Create Function dbo.GetNumbers(@Data VarChar(8000))
Returns VarChar(8000)
AS
Begin
Return Left(
SubString(@Data, PatIndex('%[0-9]%', @Data), 8000),
PatIndex('%[^0-9]%', SubString(@Data, PatIndex('%[0-9]%', @Data), 8000) + 'X')-1)
End
我怎样才能做到这一点这就是你想要的吗
select (case when v.data not like '%[0-9]%-%' and
v.data like '%[0-9]%'
then left(v2.data, patindex('%[^0-9]%', v2.data + 'x') - 1)
end)
from (values (@data)) v(data) cross apply
(values (stuff(v.data, 1, patindex('%[0-9]%', v.data)) v2(data)
为此,请抓取一份。那就容易了
对于字符串,它看起来如下所示:
DECLARE @string VARCHAR(8000) = 'E.g DQ1-12987, DQQ-12367, DS18768, AS-10383B';
SELECT
ItemNumber = ROW_NUMBER() OVER (ORDER BY f.ItemNumber),
ItemIndex = f.ItemIndex,
ItemLength = f.ItemLength,
Item = f.Item
FROM samd.patExtract8k(@string,'[^0-9]') AS f
WHERE SUBSTRING(@string,f.itemIndex+1,1) <> '-';
靠着桌子:
-- Sample Data
CREATE TABLE #strings (stringId INT IDENTITY, string VARCHAR(1000));
INSERT #strings(string)
SELECT TOP(10) NEWID() FROM sys.all_columns;
--Solution:
SELECT *
FROM #strings AS s
CROSS APPLY samd.patExtract8k(s.string,'[^0-9]') AS f
WHERE SUBSTRING(s.string,f.itemIndex+1,1) <> '-';
该函数的速度非常快,在性能上可以是任何标量UDF 其他的例子呢?
AS-10383B
是否应该因此不返回任何内容?它应该是10383B这意味着什么<代码>如果数据在'-'后面有整数,我不想考虑这个整数。< /代码>所有的样本都违反了这个要求。它给了像DQ1这样的值为空。12987@Sarita . . . 这就是你要问的:“我只需要从列中提取整数,但是如果数据之前有整数”——“我不想考虑这个整数。”至少,这就是我如何解释你的问题。
-- Sample Data
CREATE TABLE #strings (stringId INT IDENTITY, string VARCHAR(1000));
INSERT #strings(string)
SELECT TOP(10) NEWID() FROM sys.all_columns;
--Solution:
SELECT *
FROM #strings AS s
CROSS APPLY samd.patExtract8k(s.string,'[^0-9]') AS f
WHERE SUBSTRING(s.string,f.itemIndex+1,1) <> '-';
stringId string itemNumber itemIndex itemLength item
----------- --------------------------------------- ----------- ---------- ----------- ----------
1 8703661F-84D9-4AFC-9E8F-918926121A49 1 1 7 8703661
1 8703661F-84D9-4AFC-9E8F-918926121A49 2 10 2 84
1 8703661F-84D9-4AFC-9E8F-918926121A49 4 15 1 4
1 8703661F-84D9-4AFC-9E8F-918926121A49 5 20 1 9
1 8703661F-84D9-4AFC-9E8F-918926121A49 6 22 1 8
1 8703661F-84D9-4AFC-9E8F-918926121A49 7 25 9 918926121
1 8703661F-84D9-4AFC-9E8F-918926121A49 8 35 2 49
2 C93D48BD-9485-4E8E-9295-2271726F08C6 1 2 2 93
2 C93D48BD-9485-4E8E-9295-2271726F08C6 2 5 2 48
2 C93D48BD-9485-4E8E-9295-2271726F08C6 3 10 4 9485
2 C93D48BD-9485-4E8E-9295-2271726F08C6 4 15 1 4
2 C93D48BD-9485-4E8E-9295-2271726F08C6 5 17 1 8
2 C93D48BD-9485-4E8E-9295-2271726F08C6 6 20 4 9295
2 C93D48BD-9485-4E8E-9295-2271726F08C6 7 25 7 2271726
2 C93D48BD-9485-4E8E-9295-2271726F08C6 8 33 2 08
2 C93D48BD-9485-4E8E-9295-2271726F08C6 9 36 1 6