2017-11-23 10 views
1

他の文字列内の文字(またはサブ文字列)の位置を返すSQL Server CHARINDEX関数を認識しています。それでも、(私自身のUDFを開発しない限り)正規表現のサポートがあることは明らかではありませんでした。SQL Server 2012 - 文字列内の可能な文字セット内の文字の最初の検索

私が探しているのは、文字列内のセット内の任意の文字の最初の位置を見つける機能です。

例:"\の前に表示されますので、

DECLARE @_Source_String NVARCHAR(100) = 'This is "MY" string \ and here is more text' ; 

SELECT <some function> (@_Source_String,'"\') ; 

これは9を返す必要があります。一方:\x前にあるので

SELECT <some function> (@_Source_String,'x\') ; 

21を返す必要があります。

は、この機能/メカニズムが非常に高い頻度で呼び出されるため、のパフォーマンスを追加する必要があります。

ご意見ありがとうございます。

答えて

2

TSQLのパターンマッチング機能はかなり基本的なものであり、多くの場合、CLRと正規表現が必要になります。

お客様 でこの要件を実行します。角括弧内の文字のリストは、一致させる文字の集合を示します。

DECLARE @_Source_String NVARCHAR(100) = 'This is "MY" string \ and here is more text'; 

SELECT PATINDEX('%["\]%', @_Source_String), 
     PATINDEX('%[x\]%', @_Source_String); 

戻り

+------------------+------------------+ 
| (No column name) | (No column name) | 
+------------------+------------------+ 
|    9 |    21 | 
+------------------+------------------+ 
+0

マーティン、美しい(と私のニーズに適し)ソリューション。どうもありがとう!!! (言うまでもなく、それを投票した)。 – FDavidov

+0

Martin、もう1つの質問:どのように '? '文字をエスケープしますか?私が 'x'か']のどちらかを探しているとします。私は 'PATINDEX( '%[x]]]%、...)'と書かなければならないでしょうか? – FDavidov

+0

@FDavidov - [これは残念なことではないと思います](https://connect.microsoft.com/SQLServer/feedback/details/259534/patindex-missing-escape-clause) - CLRが必要になるようです正規表現を使うか、 ']'のすべてのインスタンスを他の文字に置き換えて、代わりにPATINDEXに追加してください。 –

関連する問題