SQL - 从井号 (#) 符号后的字符串中获取数字

标签 sql sql-server patindex

我正在尝试从 SQL Server 2012 中的字符串中获取数字,这些数字位于井号 (#) 符号之后和后面的任何空格之前。例如,存储号码。假设我们有以下内容:

Big Box Store #450
Big Box Store #768
Little Shop #2
Widgets Warehouse #678
Little Shop #5
Widgets Warehouse #559
Corner Boutiques #32 *CLOSED
Corner Boutiques #67 *CLOSED
Corner Boutiques #12
Buy More #1047 SUPERSTORE
1 Stop Shop #3
1 Stop Shop #17
You 2 Me #16

我将返回以下内容:450, 768, 2, 678, 5, 559, 32, 67, 12, 1047, 3, 17, 16。

如您所见,并非所有字符串末尾都有数字。其中一些甚至在商店名称中带有数字字符。我认为最好的方法就是提取井号后面的数字。

有办法做到这一点吗?我看过以下文章:

Query to get only numbers from a string

https://www.sqlservercentral.com/Forums/Topic456023-338-1.aspx

看起来 PATINDEX 可能很好用,但我不确定,因为到目前为止我所尝试的方法没有返回预期的结果。

非常感谢!

最佳答案

另一种类似的方法...使用来自 Tyron 的测试数据。即使数字后面没有空格,这也有效。

DECLARE @t TABLE(
  MyString NVARCHAR(1000)
);

INSERT INTO @t VALUES 
 ('Big Box Store #450')
,('Big Box Store #768')
,('Little Shop #2')
,('Widgets Warehouse #678')
,('Little Shop #5')
,('Widgets Warehouse #559')
,('Corner Boutiques #32*CLOSED')    --notice no space here
,('Corner Boutiques #67 *CLOSED')
,('Corner Boutiques #12')
,('Buy More #1047 SUPERSTORE')
,('1 Stop Shop #3')
,('1 Stop Shop #17')
,('You 2 Me #16');

select
    SUBSTRING(MyString,CHARINDEX('#',MyString,0) + 1,case when PATINDEX('%[^0-9]%',RIGHT(MyString,LEN(MyString) - CHARINDEX('#',MyString,0))) = 0 then 99 else PATINDEX('%[^0-9]%',RIGHT(MyString,LEN(MyString) - CHARINDEX('#',MyString,0))) - 1 end)
    --char version...
   ,SUBSTRING(MyString,CHARINDEX('#',MyString,0) + 1,case when PATINDEX('%[^0-9]%',substring(MyString,CHARINDEX('#',MyString,0) + 1,LEN(MyString) - CHARINDEX('#',MyString,0) + 1)) = 0 then 99 else PATINDEX('%[^0-9]%',substring(MyString,CHARINDEX('#',MyString,0) + 1,LEN(MyString) - CHARINDEX('#',MyString,0) + 1)) - 1 end)

from
    @t

关于SQL - 从井号 (#) 符号后的字符串中获取数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46179572/

相关文章:

mysql - SQL - 提取可变长度字符串的数字部分

sql-server-2008-r2 - 转义 T-SQL "pattern"表达式字符类中的 ] 和 ^ 字符

sql - 如何从 3 个表中选择特定数据? [PostgreSQL 9.1]

php - 获取 mysql 表列描述

sql - 为什么这个索引不能提高查询性能

sql-server - 如何将 "Lastname, Firstname"数据拆分为单独的姓氏和名字列?

sql - 如何根据最大日期获取不同的记录?

sql - 无法在 SQL Azure 中运行更新查询 *对象名称无效 'DataSync.provision_marker_dss' 。*

asp.net - asp.net 中 SP 的估计成本