在最后两个括号之间提取右字符串

时间:2019-06-11 18:12:07

标签: sql sql-server tsql

我需要提取每行最后一个括号内的值。 名称列是我需要的,而 ID 列则是我需要的。

请注意,第2行有两组括号,而一行没有括号。

![enter image description here

我尝试使用此脚本:

SUBSTRING(name,CHARINDEX('(',name)+1 ,CHARINDEX(')',name)-CHARINDEX('(',name)-1) 

脚本返回错误消息传递给LEFT或SUBSTRING函数的长度参数无效。,因为第三行没有括号。

2 个答案:

答案 0 :(得分:3)

对于您的示例数据,这应该做您想要的:

select replace(right(name, charindex('(', reverse(name) + '(') - 1), ')', '')

答案 1 :(得分:1)

由于ID始终是最后一个

SELECT *,
       REPLACE(RIGHT(Str, CHARINDEX('(', REVERSE(Str)) - 1), ')', '')
FROM (
       VALUES ('Smith, Donald R.(Don) (NBK1234)'), 
              ('Rogers, Bob (A1234457)'),
              ('Rogers, Bob (A1234457)(A1B2)')
     ) T(Str);

返回:

+---------------------------------+----------+
|               Str               |    ID    |
+---------------------------------+----------+
| Smith, Donald R.(Don) (NBK1234) | NBK1234  |
| Rogers, Bob (A1234457)          | A1234457 |
| Rogers, Bob (A1234457)(A1B2)    | A1B2     |
+---------------------------------+----------+

如果您要提取的ID并非总是结尾,而是唯一的字符串始终是数字,则

SELECT *,
       REPLACE(REVERSE(REPLACE(SUBSTRING(REVERSE(Str),PATINDEX('%[0-9]%', REVERSE(Str)), CHARINDEX('(', REVERSE(Str))-1), '(', '')), ' ', '')
FROM (
       VALUES ('Smith, Donald R.(Don) (NBK1234)'), 
              ('Rogers, Bob (A1234457)'),
              ('Rogers, Bob (A1234457)(not an id)')
     ) T(Str);

返回:

+-----------------------------------+----------+
|                Str                |    ID    |
+-----------------------------------+----------+
| Smith, Donald R.(Don) (NBK1234)   | NBK1234  |
| Rogers, Bob (A1234457)            | A1234457 |
| Rogers, Bob (A1234457)(not an id) | A1234457 |
+-----------------------------------+----------+

Live Demo

中查看其工作方式