设置
名为“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
问题是,我不知道如何做到这一点的具体细节。
希望有人可以提供帮助。谢谢!
答案 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]*"
;