【问题标题】:Getting last group of number from string从字符串中获取最后一组数字
【发布时间】:2021-11-30 01:20:48
【问题描述】:

我有这组字符串:

*INBOX_COL
14AF08
14AF09
17NAMX14
17NAMX16
21KMTZ7
21KMTZ8
21KMTZ9
B-09
B-14

假设最后一组数字(7、8、9、14 等)代表大小。

我想得到最后一组数字来确定数量

SELECT CASE WHEN (RIGHT(RTRIM(INBOX_COL),2) > '16' THEN 6 ELSE 12 END QTY
FROM MY_TABLE

但由于写法不统一,所以当我取字符串的最后两个字符时,它会返回类似这样的内容 = ('08', '8', '09','9', 'Z7', 'Z8 ') 所以它不符合 Select Case 条件。

我想像这样提取字符串:

14AF08 = 8
17NAMX14 = 14
21KMTZ7 = 7

有什么想法吗? 谢谢

【问题讨论】:

  • 您可以使用非数字字符的last index。否则只需实现您自己的标量函数从末尾循环并提取数字。

标签: sql sql-server tsql


【解决方案1】:
  1. reverse()字符串
  2. 使用patindex() 查找非数字字符
  3. 使用right()提取字符

SELECT RIGHT(INBOX_COL, PATINDEX('%[^0-9]%', REVERSE(INBOX_COL)) - 1)

【讨论】:

  • Niiii​​ce.. 简单但符合预期。谢谢
【解决方案2】:

不是最通用的方法,但如果您知道要查找的最大数字是 999,那么您只需检查最后 3 个字符,然后将它们子串出来。

select X.INBOX_COL
  -- Substring out the number component
  -- Cheeky way to ignore dash ('-')
  , replace(substring(X.INBOX_COL, Z.StringLength-Z.NumberLength+1, Z.NumberLength),'-','') Quantity
from (
  values
  ('14AF08'),
  ('14AF09'),
  ('17NAMX14'),
  ('17NAMX16'),
  ('21KMTZ7'),
  ('21KMTZ8'),
  ('21KMTZ9'),
  ('B-09'),
  ('B-14')
) X (INBOX_COL)
cross apply (
  -- Assume max value number is 999, so check last 3 characters of string
  values (
    isnumeric(case when len(X.INBOX_COL) > 0 then substring(reverse(X.INBOX_COL),1,1) else 'z' end)
    , isnumeric(case when len(X.INBOX_COL) > 1 then substring(reverse(X.INBOX_COL),2,1) else 'z' end)
    , isnumeric(case when len(X.INBOX_COL) > 2 then substring(reverse(X.INBOX_COL),3,1) else 'z' end)
  )
) Y (One, Two, Three)
cross apply (
  -- Get the expected length of the number string (and the length of the actual string)
  values (
    len(X.INBOX_COL), case when One = 1 and Two = 1 and Three = 1 then 3 when One = 1 and Two = 1 then 2 when One = 1 then 1 else 0 end
  )
) Z (StringLength, NumberLength);

返回:

INBOX_COL Quantity
14AF08 08
14AF09 09
17NAMX14 14
17NAMX16 16
21KMTZ7 7
21KMTZ8 8
21KMTZ9 9
B-09 09
B-14 14

【讨论】:

  • 哇,感谢您的输入,我根据您的解决方案创建了一个函数,现在我有了另一个选项以及@Squirrel 的答案来提取数据。
猜你喜欢
  • 2021-07-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-17
  • 1970-01-01
  • 1970-01-01
  • 2015-01-01
相关资源
最近更新 更多