2009-07-21 15 views
0

セットアップMySQLの正規表現操作

「mytableは」と呼ばれるMySQLのテーブルにはVARCHARフィールド「データ」を持っています。

フィールドは、の形式の文字列が含まれています

name1'value1''name2'value2'' ... nameN''valueN 

私は、このデータが非正規化されて承知している - これが唯一の文字であるため、私は区切りとして 'を使用することを余儀なくされてきたこと名前または値として許可されていません。ここで

は、いくつかの例のデータです:

one'.6332''two'.4231''three'.343''four'.034 
two'.4332''four'.033''five'.043 
four'.2323''seven'.3409''nine'.003 

問題

私は名前/値のペアに基づいて "mytableは" から行を選択しようとしています。たとえば、データフィールド内の名前が「4」で、値が.1より小さいすべての行を選択したいとします。 (これは行1と2を返すはずです)。

私はこれをワンステップで行いたいと思います。私はデータを非正規化してこのようにするのは非常に簡単だが、私はそうしたくないと思います。この操作はたいてい500行でしか行われないので、私はそのパフォーマンスに非常に関心がありません。入力$名と$ valueに

、私は解決策は、次のようになりますと仮定します。

SELECT * FROM mytable WHERE 
    TO_INT(reg_ex(<crazyregex which selects $name>, data)) < $value 

問題は、私はこれを行う方法の詳細を知らない、です。

誰かが助けることができます。ありがとう!

+0

ありませんか? –

答えて

2

醜いが、私はそれがうまくいくと思う:1または0を返す方法以外のMySQLの正規表現を行うには方法は他の方法は本当に

CREATE TABLE t (d varchar(255)); 

INSERT INTO t (d) VALUES 
    ("one'.6332''two'.4231''three'.343''four'.034"), 
    ("two'.4332''four'.033''five'.043"), 
    ("four'.2323''seven'.3409''nine'.003"), 
    ("four'.011''five'.043"), 
    ("four'.100''seven'.3409''nine'.003") 
; 


SELECT 
    d, 
    convert(
    right(d, length(d) - instr(d, "four'")- 4), 
    decimal(5,4) 
) as v 
FROM t 
where d regexp "four'.0[0-9]*" 
; 
+0

ありがとうございました!私は、1または0ではなくマッチを返す正規表現関数がMySQLに存在しないことに驚いています。 –