我正在尝试从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。
您可以看到,并非所有字符串都在最后都有数字。他们中的一些人甚至具有商店名称的数字字符。我认为最好的方法就是在磅标志之后提取数字。
有办法做到这一点吗?我查看了以下文章:
查询仅从字符串获得数字
https://www.sqlservercentral.com/forums/topic456023-338-1.aspx
看来PATINDEX
可能很好地使用,但是我不确定我尝试过的是迄今为止没有返回预期结果。
非常感谢!
使用泰隆的测试数据。即使数字后没有空间,这也有效。
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
不是很漂亮,但似乎可以满足您的要求。; - )
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')
,('Corner Boutiques #67 *CLOSED')
,('Corner Boutiques #12')
,('Buy More #1047 SUPERSTORE')
,('1 Stop Shop #3')
,('1 Stop Shop #17')
,('You 2 Me #16');
SELECT MyString
,SUBSTRING(MyString
,CHARINDEX('#', MyString) + 1
,CASE(CHARINDEX(' ', SUBSTRING(MyString
,CHARINDEX('#', MyString) + 1
,LEN(MyString) - CHARINDEX('#', MyString)
)
)
)
WHEN 0 THEN LEN(MyString) - CHARINDEX('#', MyString)
ELSE CHARINDEX(' ', SUBSTRING(MyString
,CHARINDEX('#', MyString) + 1
,LEN(MyString) - CHARINDEX('#', MyString)
)
) - 1
END
) AS MyNumber
FROM @t
请使用PathIndex
尝试一下 DECLARE @TABLE AS TABLE(
name_col varchar(250)
)
INSERT INTO @TABLE
SELECT
'Big Box Store #450' UNION ALL
SELECT'Big Box Store #768'UNION ALL
SELECT'Little Shop #2'UNION ALL
SELECT'Widgets Warehouse #678'UNION ALL
SELECT'Little Shop #5'UNION ALL
SELECT'Widgets Warehouse #559'UNION ALL
SELECT'Corner Boutiques #32 *CLOSED'UNION ALL
SELECT'Corner Boutiques #67 *CLOSED'UNION ALL
SELECT'Corner Boutiques #12'UNION ALL
SELECT'Buy More #1047 SUPERSTORE'UNION ALL
SELECT'1 Stop Shop #3 132132'UNION ALL
SELECT'1 Stop Shop #17'UNION ALL
SELECT'You 2 Me #16'
SELECT
LEFT(SUBSTRING(
SUBSTRING(name_col,CHARINDEX('#',name_col) + 1,LEN(name_col)),
PATINDEX('%[0-9.-]%',SUBSTRING(name_col,CHARINDEX('#',name_col) + 1,LEN(name_col))), 8000),
PATINDEX('%[^0-9.-]%', SUBSTRING(SUBSTRING(name_col,CHARINDEX('#',name_col) + 1,LEN(name_col)),
PATINDEX('%[0-9.-]%', SUBSTRING(name_col,CHARINDEX('#',name_col) + 1,LEN(name_col))), 8000) + 'X') -1)
FROM @TABLE
您的怀疑是正确的,使用Patindex是解决方案,请检查链接以获取更多信息。