2017-07-17 6 views
0

私は、以下の文字列を持っている:出力は次のようになりますので、私は、最後の括弧内の値を解析する必要が解析文字列の最後のCHARINDEXの発生に基づいて

Hello World (111) 
Welcome to the World (GI 135) (222) 
Another Hello World String (ID 12) (141) (333) 

111 
222 
333 

私はどのように常に最後の括弧のためにcharindex/patindexを得るために動的にするかわかりません。これはこれまで私が持っているものです:

DECLARE @str TABLE (varString VARCHAR(100)); 

INSERT INTO @str 
     (varString) 
VALUES ('Hello World (111)'), 
     ('Welcome to the World (GI 135) (222)'), 
     ('Another Hello World String (ID 12) (141) (333)'); 

SELECT varString 
     ,Parsed = CASE WHEN PATINDEX('%[0-9])%', varString) - PATINDEX('%([0-9]%', varString) > 0 THEN SUBSTRING(varString, PATINDEX('%([0-9]%', varString) + 1, PATINDEX('%[0-9])%', varString) - PATINDEX('%([0-9]%', varString)) 
         ELSE NULL 
       END 
FROM @str; 

Hello World (111)の場合のみ動作します。

答えて

0

Nevermind。私はそれを持っている。

SELECT varString 
     ,Parsed = REVERSE(SUBSTRING(REVERSE(varString), 2, CHARINDEX('(', REVERSE(varString)) - 2)) 
FROM @str; 

しかし、最後のcharindexの出現を検出することに基づく他の解決策がある場合は、それを共有すれば幸いです。

あなたが逆に使用して以下のように最新のを取得することができます
0

XMLとして文字列を扱う
Select *, Replace(substring(txt,len(txt) - charindex('(', Reverse(txt))+2, len(txt)), ')', '') 
from #yourtext 
0

、基本的にはタグによってブラケットを交換し、最後を取得するための別の解決策になるのxmlとしてキャストと最後を得ることができます要素:あなたが投稿

select cast(replace(replace(varstring,'(','<n>'),')','</n>') as xml).query('//n[last()]/text()') 
+0

を。ありがとう。良いアイデア。 – DNac

0

ソリューションは、右括弧で終了する文字列を必要とし、でも、末尾のスペースは、それを殺すだろう。

XMLソリューションは優れています(last()関数@Jayveeを使用しています)が優れていますが、1つの右か左の括弧を追加または減算することで簡単に破損します。

は、下の2つの動作し、簡単に検索するために探している人々によって変更することができるソリューションと言う、数字の最初グループや数字のセットのすべてです。最初のソリューションはPatterSplitCMを使用し、2番目のソリューションはNGrams8Kを使用します。以下のサンプルデータと両方のソリューションを更新しました。

DECLARE @str TABLE (stringId int identity, varString VARCHAR(100)); 

INSERT INTO @str(varstring) 
VALUES ('Hello World (111)'), 
     ('Welcome to the World (GI 135) (222)'), 
     ('Another Hello World String (ID 12) (141) (333)'), 
     ('Hello World (55555).'), -- added a period (.) 
     ('Welcome to the World (GI 135) (999) and smile (:'), -- add unclosed parentheses, 
     ('Another Hello World String (ID 1212) (14111) (33333)) '), -- ends with a space 
     ('No numbers here. Sorry.') 

-- SOLUTION #1 (using PatternSplitCM) 
SELECT stringId, varString, item 
FROM 
(
    SELECT stringId, varString, item, 
     rn = ROW_NUMBER() OVER (PARTITION BY varstring ORDER BY itemnumber DESC) 
    FROM @str 
    CROSS APPLY dbo.PatternSplitCM(varString, '[0-9]') 
    WHERE [Matched] = 1 
) x 
WHERE rn = 1 
--ORDER BY stringId; 
; 
-- SOLUTION #2 (using NGrams8K) 
SELECT stringId, varString, item 
FROM 
(
    SELECT stringId, varString, 
     item = SUBSTRING 
       (
        varString, 
        position+1, 
        CHARINDEX(')', varString, position+1)-(position+1) 
       ), 
     rn = ROW_NUMBER() OVER (PARTITION BY varstring ORDER BY position DESC) 
    FROM @str 
    CROSS APPLY dbo.ngrams8k(varString,1) 
    WHERE token = '(' 
    AND CHARINDEX(')', varString, position+1) > 0 -- exclude strings without closing parenthesis 
) x 
WHERE rn = 1 

各クエリが返されます。かなりいいです

stringId varString            item 
--------- ----------------------------------------------------- ---------- 
1   Hello World (111)          111 
2   Welcome to the World (GI 135) (222)     222 
3   Another Hello World String (ID 12) (141) (333)  333 
4   Hello World (55555).         55555 
5   Welcome to the World (GI 135) (999) and smile (:  999 
6   Another Hello World String (ID 1212) (14111) (33333)) 33333 
+0

他の提案をありがとう。私のプロンプトでは、私はまた、コードのような場合:場合は、varStringのように '%([0-9]%[0-9])%'それで...あなたが言及した問題からそれを保護する必要があります。 – DNac

関連する問題