尝试从 sql server 中的 varchar 字段中提取特定字符串。然后我只需要该字符串的最后 4 位数字。尝试过 substring 和 patindex 但不知道如何获取最后 4 位数字。这是一次尝试,但它只给了我文本的第一部分。
SUBSTRING([column], (PATINDEX('%ID0%-[0-9][0-9][0-9][0-9][0-9]%',[column])),9)
下面的示例数据
Brian Larry, Hays Hill XX, ID007370, Option code - 0123 4567, AAA - XX
ID007366 - Dave Jones - XX - Option Code 0121 9999
ID00 7120 Brian Smith XX Branded company
ID07113 Gary Barnes - LLL 0123 9111 AAA LLL
ID00 7120 Charles Old XX Recall operation
ID0007439 - Kerry Hill - Maidstone XX - Option Code 0124 234 BBB XX
ID006817 Paul George Jackson 1234 8464 AAA Recall operation
所以我需要提取 ID00000 号码,但只返回最后 4 位数字。因此,对于 ID007370,我只想返回 7370。ID 号的长度也可以不同。
类似这样的东西看起来很有效:
SELECT RIGHT(SUBSTRING(string_nonspace, y.start, PATINDEX('%[^0-9]%', STUFF(string_nonspace, 1, start + 1, '')) + 1), 4)
FROM (
VALUES (N'Brian Larry, Hays Hill XX, ID007370, Option code - 0123 4567, AAA - XX')
, (N'ID007366 - Dave Jones - XX - Option Code 0121 9999')
, (N'ID00 7120 Brian Smith XX Branded company')
, (N'ID07113 Gary Barnes - LLL 0123 9111 AAA LLL')
, (N'ID00 7120 Charles Old XX Recall operation')
, (N'ID0007439 - Kerry Hill - Maidstone XX - Option Code 0124 234 BBB XX')
, (N'ID006817 Paul George Jackson 1234 8464 AAA Recall operation')
) t (col1)
CROSS APPLY (
SELECT replace(col1, ' ', '') AS string_nonspace
) x
CROSS APPLY (
SELECT PATINDEX('%ID[0-9]%', string_nonspace) AS start
) y
输出:
身份证 | 字符串_非空格 |
---|---|
7370 | BrianLarry,HaysHillXX,ID007370,选项代码-01234567,AAA-XX |
7366 | ID007366-DaveJones-XX-选项代码01219999 |
7120 | ID007120BrianSmithXX品牌公司 |
7113 | ID07113GaryBarnes-LLL01239111AAALLL |
7120 | ID007120CharlesOldXX召回操作 |
7439 | ID0007439-KerryHill-MaidstoneXX-选项代码0124234BBBXX |
6817 | ID006817PaulGeorgeJackson12348464AAA召回操作 |
我删除空格,然后通过
PATINDEX('%ID[0-9]%'
找到起始位置。然后我剪辑字符串,以便删除 ID 部分,然后搜索第一个非数字值。完成后,您可以在 start 和第一个非数字值之间执行 SUBSTRING。最后,RIGHT(..., 4)
获取最后四个字符。
当然,这段代码会在许多格式错误的字符串上失败,但它们会中断,数据内有点“鼓风机”