我需要提取每行最后一个括号内的值。 名称列是我需要的,而 ID 列则是我需要的。
请注意,第2行有两组括号,而一行没有括号。
我尝试使用此脚本:
SUBSTRING(name,CHARINDEX('(',name)+1 ,CHARINDEX(')',name)-CHARINDEX('(',name)-1)
脚本返回错误消息传递给LEFT或SUBSTRING函数的长度参数无效。,因为第三行没有括号。
答案 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 |
+-----------------------------------+----------+
中查看其工作方式