我正在寻找修剪字符串的方法,以便只有6个连续数字显示

时间:2017-01-16 19:52:15

标签: sql sql-server-2008 tsql

数字位于字符串中的不同位置,并且没有设置前导或结尾字符。使用SQL Server 2008。

例如,这里是列中前三个字符串的缩短版本。

...test on no leaks #162581 $273.85 AR

...Invoice 162481AR $160

...invoice number 162911 total $164

我正在寻找回报

162581
162481
162911

我已尝试使用PATINDEX,但它只返回字符串中有6位数的次数,而不是实际的6位连续数字。

我希望使用类似这样的东西(返回无效的长度参数),但我绝对愿意接受其他建议。

LEFT(d.Notes, CHARINDEX('%[0-9][0-9][0-9][0-9][0-9][0-9]%', d.Notes) -1) 
AND RIGHT(d.Notes, CHARINDEX('%[0-9][0-9][0-9][0-9][0-9][0-9]%', d.Notes) -1)

更新

使用PATINDEX代替CHARINDEX工作到一定程度。在有多个连续六位数的情况下怎么办?

例如,其中一个字符串是

107750 108830 Invoice 162481AR $160

我希望仅返回发票编号(162481)或基本上超过120000的任何内容

我尝试过使用以下两个公式

WHEN SUBSTRING(d.Notes, PATINDEX('%[0-9][0-9][0-9][0-9][0-9][0-9]%', d.Notes), 6) > '120000' 
THEN SUBSTRING(d.Notes, PATINDEX('%[0-9][0-9][0-9][0-9][0-9][0-9]%', d.Notes), 6)

WHEN d.Notes LIKE '%[0-9][0-9][0-9][0-9][0-9][0-9]%' 
AND SUBSTRING(d.Notes, PATINDEX('%[0-9][0-9][0-9][0-9][0-9][0-9]%', d.Notes), 6) >= '120000'
THEN SUBSTRING(d.Notes, PATINDEX('%[0-9][0-9][0-9][0-9][0-9][0-9]%', d.Notes), 6)

但两者都没有返回值。还有什么我应该尝试的吗?

1 个答案:

答案 0 :(得分:1)

你关闭了!您需要使用PATINDEX代替CHARINDEX

之后,您可以使用SUBSTRING将六个数字拉出来。

这应该适合你:

Select  SUBSTRING(d.Notes, PATINDEX('%[0-9][0-9][0-9][0-9][0-9][0-9]%', d.Notes), 6) 
From    YourTable d

如果您的表中有没有连续六个数字的记录,您也可以使用以下任何一种:

当找不到六个连续数字时,将结果默认为NULL

Select  Case When PATINDEX('%[0-9][0-9][0-9][0-9][0-9][0-9]%', d.Notes) <> 0 
            Then SUBSTRING(d.Notes, PATINDEX('%[0-9][0-9][0-9][0-9][0-9][0-9]%', d.Notes), 6) 
            Else Null
        End 
From    YourTable d

在没有连续六个数字的情况下不撤回结果

Select  SUBSTRING(d.Notes, PATINDEX('%[0-9][0-9][0-9][0-9][0-9][0-9]%', d.Notes), 6) 
From    YourTable d
Where   d.Notes LIKE '%[0-9][0-9][0-9][0-9][0-9][0-9]%'