2011-07-07 11 views
5

私は、MySQLが正規表現マッチからキャプチャグループの値を取得することをサポートしていないと言うことができます。私はこの機能を追加するサーバー側拡張(lib_mysqludf_preg)を見つけましたが、私の環境にこの拡張機能をインストールすることはできません。mysqlのregexキャプチャグループをシミュレートする

私は、正規表現マッチの一部をSQLクエリの列としてキャプチャすることをシミュレートする方法を探しています。

私のデータは、以下の(と私は、サーバー上のデータフォーマットを変更することはできません)のようになります。

+-----------------------------+ 
| Version      | 
+-----------------------------+ 
| 1.2.3.4      | 
| 10.20.30.40     | 
| Obsidian-1.2.3.4   | 
| Obsidian-11.21.31.41  | 
| custom\Obsidian-11.21.31.41 | 
| custom\11.21.31.41   | 
+-----------------------------+ 

私はそれぞれの行から最後の4桁のそれぞれを捕獲するために探しています。数字は常に値の最後の部分で、常にドットで区切られます。私はwhere句で数字を使用できるように列として各桁をキャプチャする機能のいくつかの組み合わせを

.*[[:digit:]]+\\.[[:digit:]]+\\.[[:digit:]]+\\.[[:digit:]]+$ 

私が望んでいた結果をされて、次の正規表現は、私がしたいすべての値と一致します私のクエリのバージョン番号を取得することができます。

SELECT 
    function1(...) as version1, 
    function2(...) as version2, 
    function3(...) as version3, 
    function4(...) as version4 
FROM Version 
WHERE version1 > 5; 
+0

あなたが選択したプログラミング言語でこれを行うだけではどうですか? – Qtax

+1

少なくとも、 'SUBSTRING_INDEX(ver、 '。'、-1)をversion4'として最後の数字を簡単に得ることができます。他のものは、[MySQLs文字列関数](http://dev.mysql.com/doc/refman/5.5/en/string-functions.html)を使いこなすことによって得ることができます。拡張機能をインストールせずにより良い方法があるかどうかわからない。 – Qtax

答えて

3

いくつかの試行錯誤の後、私は必要なことをする次のクエリを思いつきました。基本的には、文字列の最後から数字を分離してから、次の数字を分ける前にその多くの文字を削除します。 version1の列は正の2桁の数字に限定されていますが、それは私のケースでは生き残ることができる限界です。

SELECT 
    IF(CAST(RIGHT(SUBSTRING_INDEX(LEFT(version,CHAR_LENGTH(version) - CHAR_LENGTH(SUBSTRING_INDEX(version, '.', -3)) - 1), '.', -1),2) AS DECIMAL) > 0, 
     CAST(RIGHT(SUBSTRING_INDEX(LEFT(version,CHAR_LENGTH(version) - CHAR_LENGTH(SUBSTRING_INDEX(version, '.', -3)) - 1), '.', -1),2) AS DECIMAL), 
     CAST(RIGHT(SUBSTRING_INDEX(LEFT(version,CHAR_LENGTH(version) - CHAR_LENGTH(SUBSTRING_INDEX(version, '.', -3)) - 1), '.', -1),1) AS DECIMAL)) AS version1, 
    SUBSTRING_INDEX(LEFT(version,CHAR_LENGTH(version) - CHAR_LENGTH(SUBSTRING_INDEX(version, '.', -2)) - 1), '.', -1) as version2, 
    SUBSTRING_INDEX(LEFT(version,CHAR_LENGTH(version) - CHAR_LENGTH(SUBSTRING_INDEX(version, '.', -1)) - 1), '.', -1) as version3, 
    SUBSTRING_INDEX(version, '.', -1) as version4 
FROM Version 
HAVING version1 >= 5 
; 
関連する問題