所以,你需要抓住字符串末尾最后一组左括号和右括号之间的任何内容,对吧?
首先,从字符串末尾找到第一个左括号。我会使用 CHARINDEX,因为您只是在寻找一个字符;您不需要使用模式匹配。
SELECT LEN(ProgrammeName) + 1 - CHARINDEX('(', REVERSE(ProgrammeName)) FROM Table
然后,从字符串末尾找到第一个右括号:
SELECT LEN(ProgrammeName) + 1 - CHARINDEX(')', REVERSE(ProgrammeName)) FROM Table
然后,把它们放在一起。要使用SUBSTRING,你需要第一个字符的位置,然后是你想要的字符串的长度,所以你需要第一个结果('(')的位置,然后是第二个结果减去第一个结果,得到括号位的长度,作为起点:
SELECT (LEN(ProgrammeName) + 1 - CHARINDEX(')', REVERSE(ProgrammeName))) - (LEN(ProgrammeName) + 1 - CHARINDEX('(', REVERSE(ProgrammeName))) FROM Table
您还需要做一些摆弄来提取括号之间的部分,只留下括号。这在最后一个示例的注释中进行了解释,最终表达式应该完成您想要的工作:
SELECT
-- Position of first bracket
LEN(ProgrammeName) + 1 - CHARINDEX('(', REVERSE(ProgrammeName)),
-- Position of second bracket
LEN(ProgrammeName) + 1 - CHARINDEX(')', REVERSE(ProgrammeName)),
-- Position of second bracket minus position of first bracket gives length
(LEN(ProgrammeName) + 1 - CHARINDEX(')', REVERSE(ProgrammeName))) - (LEN(ProgrammeName) + 1 - CHARINDEX('(', REVERSE(ProgrammeName))),
-- If we want to extract the bit between the brackets, we need to start from the bracket position
-- plus one character, and knock one off the length, to avoid grabbing the closing bracket.
SUBSTRING(ProgrammeName, 1 + LEN(ProgrammeName) + 1 - CHARINDEX('(', REVERSE(ProgrammeName)), (LEN(ProgrammeName) + 1 - CHARINDEX(')', REVERSE(ProgrammeName))) - (LEN(ProgrammeName) + 1 - CHARINDEX('(', REVERSE(ProgrammeName))) - 1)
FROM
Table
我已经分解了我的答案,所以你可以看到我是如何处理这些问题的——一次做一点,一边检查结果,一边更容易理解。