MySQL:检查范围间隔中是否包含值

时间:2011-08-09 11:39:53

标签: mysql regex parsing range intervals

我想知道是否可以检查列中是否包含字符串值,前提是该列包含起始值和结束值。

例如:如果表格的列NR包含以下行:

400-500
45-76,23-25
12,14-19,21

我想找到其中值为421的行。所以答案应该是第一行。

这可以在mysql中使用吗?

2 个答案:

答案 0 :(得分:2)

您应该有两个表:一个用于列,一个用于列范围。有了它,一个简单的查询将检索你需要的东西。

CREATE TABLE foo (
    foo_id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
    PRIMARY KEY (foo_id)
)
ENGINE=InnoDB;

CREATE TABLE foo_range (
    foo_id INT(10) UNSIGNED NOT NULL,
    column_from INT(10) UNSIGNED NOT NULL,
    column_to INT(10) UNSIGNED NOT NULL,
    INDEX foo_range_fk1 (foo_id),
    CONSTRAINT foo_range_fk1 FOREIGN KEY (foo_id) REFERENCES foo (foo_id)
)
ENGINE=InnoDB;

INSERT INTO foo(foo_id)
VALUES (1), (2), (3);

INSERT INTO foo_range(foo_id, column_from, column_to)
VALUES (1, 400, 500), (2, 45, 74), (2, 23, 25), (3, 12, 14), (3, 19, 21);

SELECT foo_id
FROM foo_range
WHERE 421 BETWEEN column_from AND column_to;

实际上,除非您想存储其他数据,否则主表甚至不需要:)

如果您遇到其他数据库设计,您可能需要检索所有行并使用客户端语言进行匹配。

答案 1 :(得分:0)

我同意上述评论。 向表中添加两列并使用substring_index()函数

更新它
update table
set lft_value = substring_index(value,'-',1),
rgt_value = substring_index(value,'-',-1) 

如果一切正常,请删除原始值。 现在,在下限和上限内找到值非常简单。

修改。保持表结构查询将成为:

select * from table
where 421 between
substring_index(value,'-',1),
and substring_index(value,'-',-1) 

但我不喜欢这个解决方案。