数字位于字符串中的不同位置,并且没有设置前导或结尾字符。使用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)
但两者都没有返回值。还有什么我应该尝试的吗?
答案 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]%'