MySql - 结合REGEXP和BETWEEN函数

时间:2014-07-25 12:20:46

标签: mysql regex between

我有这张桌子。

+--------+----------------+
| id     | e_id           |
+--------+----------------+
| 164462 | " 3 1 2 4 6 "   |
| 164463 | " 185 1 2 4 6 " |
| 164464 | " 3 1 2 1140 6 "|
| 164465 | " 52 1 2 4 6 "  |
| 164466 | " 3 1 175 4 6 " |
| 164467 | " 3 1 2 4 6 "   |
| 164468 | " 3 1 2 4 6 "   |
| 164469 | " 3 1 2500 4 6 "|
| 164470 | " 82 1 2 4 6 "  |
| 164471 | " 3 1 2 4 6 "   |
| 164472 | " 3 1 50 4 6 "  |
| 164473 | " 3 1 2 4 6 "   |
+--------+-----------------+

我必须找到包含175到2574之间数字的行,但数字只与[[:space:]]分开。

我试图像这样使用mysql查询:

 select * 
   from table_name 
   where e_id between REGEXP '[[:space:]]175[[:space:]]' 
     and  REGEXP '[[:space:]]2574[[:space:]]';

......和很多像这样的组合,但没有运气......

感谢您的帮助!:)

1 个答案:

答案 0 :(得分:0)

你永远不应该有这样的"列表"在单个数据库列中。在这种情况下,您应该有另一个表格,一次链接一个e_id

无论如何,这是解决问题的方法如果边界不动态:创建一个正则表达式以匹配175和2574之间的每个数字:

SELECT *
FROM table_name
WHERE e_id REGEXP("[[:space:]](1(7[5-9]|[89]\d)|[2-9]\d{2}|1\d{3}|2([0-4]\d{2}|5[0-6]\d|57[0-4]))[[:space:]]")

正则表达式详细信息:

  • 1(7[5-9]|[89]\d)将匹配175到199
  • [2-9]\d{2}将匹配200至999
  • 1\d{3}将匹配1000至1999
  • 2([0-4]\d{2}将匹配2000至2499
  • 25[0-6]\d将匹配2500至2699
  • 257[0-4]将匹配2570至2574

这个解决方案很难看,因为你的数据库太丑了 它适用于特定的边界,但正如您所看到的,如果您更改这些边界,则需要重写另一个正则表达式。


你应该拥有什么:

包含您的ID的表格,另一个包含" e_ids"的表格,然后是第三个用于链接两者的表格:

CREATE TABLE `elements` (
    `id` INT NOT NULL AUTO_INCREMENT,
    PRIMARY KEY (`id`)
);
CREATE TABLE `other_elements` (
    `e_id` INT NOT NULL AUTO_INCREMENT,
    PRIMARY KEY (`e_id`)
);
CREATE TABLE `link_table` (
    `id` INT NOT NULL,
    `e_id` INT NOT NULL,
    INDEX `id` (`id`),
    INDEX `e_id` (`e_id`),
    CONSTRAINT `FK__elements` 
        FOREIGN KEY (`id`) 
        REFERENCES `elements` (`id`) 
        ON UPDATE CASCADE 
        ON DELETE CASCADE,
    CONSTRAINT `FK__other_elements` 
        FOREIGN KEY (`e_id`) 
        REFERENCES `other_elements` (`e_id`) 
        ON UPDATE CASCADE 
        ON DELETE CASCADE
);

然后,您将能够轻松获得所需内容:

SELECT *
FROM elements e
JOIN link_table l
  ON l.id = e.id
WHERE l.e_id BETWEEN 175 AND 2574