3

我试图从 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可能很好用,但我不确定到目前为止我所尝试的并没有返回预期的结果。

非常感谢!

4

3 回答 3

1

不是很漂亮,但似乎可以满足您的要求。;-)

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
于 2017-09-12T15:05:59.627 回答
1

另一种类似的方式......使用来自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
于 2017-09-12T15:12:09.450 回答
0

请试试这个,使用 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是解决方案,请查看链接以获取更多信息。

于 2017-09-12T15:10:35.807 回答