つまり、文字列の末尾にある開き括弧と閉じ括弧の最後のセットの間にあるものをすべて取得する必要がありますよね?
まず、文字列の末尾から最初の開き括弧を見つけます。単一の文字を探しているだけなので、CHARINDEX を使用します。パターン マッチングを使用する必要はありません。
SELECT LEN(ProgrammeName) + 1 - CHARINDEX('(', REVERSE(ProgrammeName)) FROM Table
次に、文字列の末尾から最初の閉じ括弧を見つけます。
SELECT LEN(ProgrammeName) + 1 - CHARINDEX(')', REVERSE(ProgrammeName)) FROM Table
次に、それらをまとめます。SUBSTRING を使用するには、最初の文字の位置、次に必要な文字列の長さが必要なので、最初の結果 ('(') の位置、次に 2 番目の結果から最初の結果を引いた値が必要です。開始点として、括弧で囲まれたビットの長さ:
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
このような問題に私がどのようにアプローチしているかを理解できるように、回答を分解しました。一度に 1 つずつ実行し、結果を確認しながら進めていくと、理解しやすくなります。