【问题标题】:Need to Extract Integers from Sting需要从 Sting 中提取整数
【发布时间】:2020-09-13 10:49:17
【问题描述】:

我有一个字符串和整数混合的列

E.g  DQ1-12987, DQQ-12367, DS18768, AS-10383B

我只需要从列中提取整数,但如果数据在“-”之前有整数,我不想考虑那个整数。

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

我怎样才能做到这一点

【问题讨论】:

  • 其他例子呢? AS-10383B 因此应该什么都不返回吗?
  • 应该是10383
  • 这是什么意思? if the Data has Integer after '-' I don't want to consider that Integer.您的所有样本都违反了该要求。

标签: sql tsql wildcard


【解决方案1】:

这是你想要的吗?

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)

【讨论】:

  • 它给了我 null 对于像 DQ1-12987 这样的值
  • @Sarita 。 . .这就是你所要求的:“我只需要从列中提取整数,但如果数据在'-'之前有整数,我不想考虑那个整数。”至少,我是这样解释你的问题的。
【解决方案2】:

为此获取patExtract8K 的副本。然后很容易。

对一个字符串它看起来像这样:

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) <> '-';

返回:

ItemNumber  ItemIndex   ItemLength  Item
----------- ----------- ----------- --------
1           10          5           12987
2           21          5           12367
3           30          5           18768
4           40          5           10383

对表:

-- 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

该函数速度极快,并且在性能上将是任何标量 UDF。

【讨论】:

    猜你喜欢
    • 2021-10-23
    • 1970-01-01
    • 1970-01-01
    • 2021-09-27
    • 1970-01-01
    • 2021-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多