Операции с регулярными выражениями MySQL - PullRequest
0 голосов
/ 21 июля 2009

Настройка

Таблица mysql с именем «mytable» имеет поле 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" на основе пары имя / значение. Например, я хотел бы выбрать все строки, которые в своем поле данных имеют имя «четыре» и соответствующее значение меньше .1. (Это должно вернуть строки 1 и 2).

Я бы хотел сделать это за один шаг. Я понимаю, что могу денормализовать данные и довольно легко сделать это таким образом, но я бы предпочел этого не делать. Эта операция будет выполняться не более чем на 500 строках, поэтому я не сильно обеспокоен ее производительностью.

Для входных данных $ name и $ value я предполагаю, что решение будет выглядеть примерно так:

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

Проблема в том, что я не знаю, как это сделать.

Надеясь, что кто-нибудь может помочь. Спасибо!

1 Ответ

2 голосов
/ 21 июля 2009

Безобразно, но я думаю, что это работает:

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]*"
;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...