web-dev-qa-db-ja.com

正規表現に似たSQL

関数内で正規表現をLIKEに変換する良い方法はありますか(MSSQL)? sprocはこれより複雑になることはありません:

(country\=)(?<Country>[\w\d]+)(\&sessionid\=)(?<SessionId>.+)

グループはLIKEでは使用されません。別の目的で使用されます。

私はこれをsproc内で次のように遅く使用したいと思います:

SELECT * FROM [Table]
WHERE test_regex(regex, 'text') = 1

正規表現が[表]の一部である場合

8
Andreas

CLR関数を使用して、SQLサーバーに正規表現解析を追加することができます。これはSQL2005以降で可能です。すばらしい例については、 ここ を参照してください。

4
edosoft

想像します

SELECT ...
FROM [Table]
WHERE col LIKE 'country=[A-Za-z0-9]%&sessionid=[A-Za-z0-9]%'

十分に近いかもしれませんか?目的が空白でない国とセッションIDの値を持つレコードを戻すことだけである場合。

列の値が必ずしも「国」で始まらない場合は、WHERE col LIKE '%country=[A-Za-z0-9]%&sessionid=[A-Za-z0-9]%'を使用する必要があります。これにより、KMの回答に従って処理速度が大幅に低下する可能性があります。

4
Martin Smith

Sqlのこの関数を確認してください。それはあなたがあなたの仕事を達成するのを助けるかもしれません:PATINDEX('%[^0-9\.]%',@Input)

PATINDEX(Transact-SQL)

3
Pranay Rana

無料の SQL# 内で正規表現機能を使用します。このアプローチでパフォーマンスの問題は発生していません。

2
Joel Mansford

これは大きなテーブルでは非常に遅く実行され、すべての行の文字列列を解析します。

テーブルを変更できる場合は、その文字列列を別の列に分割する方がよい場合があります。これにより、従来のWHERE country=... AND sessionid=...を使用でき、この方法でインデックスを追加して使用することもできます。

2
KM.

箱から出していない。 SQL Serverで正規表現検索に最も近いのはPATINDEX()ですが、これは正規表現を実行しません。

これが本当に必要な場合は、代わりに正規表現を実行するためのCLR関数を作成する必要があります。速度が気になるかもしれませんが、正規表現やパターンに関しては、とにかくインデックスを使用できることはほとんどありません。

1
Dave Markle