0

スクリプトに構文エラーがあると思いますが、どこにあるのかわかりません。

セルの右から始まる ( ) のペアの間にある整数を選択したいですか? 理由は、文字を含む別のブラケットのペアがある可能性があるためです

いくつかのレコードが何らかの理由で右括弧なしである場合..

例えば

Period | ProgrammeName             |  
Jan    | ABC (Children) (30)       |  
Feb    | Helloworld (20T (20)      |  

結果: 30 20

select
    Period,
    ProgrammeName,
     substring(ProgrammeName,(len(ProgrammeName) - (patindex('%(%', Reverse(ProgrammeName)))+2),(len(ProgrammeName)-1))
 from
    Table


30)
20)しか表示されません

「)」を抽出しないように操作していますが、期待した結果が得られません。

4

1 に答える 1

2

つまり、文字列の末尾にある開き括弧と閉じ括弧の最後のセットの間にあるものをすべて取得する必要がありますよね?

まず、文字列の末尾から最初の開き括弧を見つけます。単一の文字を探しているだけなので、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 つずつ実行し、結果を確認しながら進めていくと、理解しやすくなります。

于 2010-07-20T08:44:30.417 に答える