MySQL正则表达式操作

时间:2009-07-21 00:30:52

标签: mysql regex

设置

名为“mytable”的mysql表有一个VARCHAR字段“data”。

该字段包含格式为的字符串:

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行,因此我并不十分关注其性能。

对于输入$ name和$ value,我假设解决方案看起来像:

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

问题是,我不知道如何做到这一点的具体细节。

希望有人可以提供帮助。谢谢!

1 个答案:

答案 0 :(得分:2)

丑陋,但我认为它有效:

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]*"
;