SQL SELECT查询给定列的行数据中的多个值和范围。
问题描述:
服务器:MySQL
数据库:Customer
表:Lan
列:Allowed VLAN
(在1-4096范围内)
一行在Allowed VLAN
列中包含以下数据:
180,181,200,250-499,550-811,826-mismatched
我需要一个SELECT
语句WHERE
,Allowed VLAN
列包含一个给定的数字,例如'600'
。给定数字'600'
甚至是逗号分隔值之一或包含在任何范围“250-499”,“550-811”中,或者它只是“826不匹配”范围的起始数值。
SELECT * WHERE `Allowed VLAN`='600' OR `Allowed VLAN` LIKE '%600%' OR (`Allowed VLAN` BETWEEN '1-1' AND '1-4096');
我无法弄清楚如何使用WHERE Clause处理数据范围。我使用explode()拆分函数等解决了PHP代码的问题,但我认为有一些SQL SELECT解决方案。
如果有任何帮助,我将不胜感激。
答案 0 :(得分:0)
我强烈建议您规范数据。将逗号分隔的项目列表存储在一行通常不是一个好主意。
假设你可以做出这样的改变,那么这样的事情应该适合你(尽管你可以考虑将你的范围存储在不同的列中以使其更容易):
create table lan (allowedvan varchar(100));
insert into lan values
('180'),('181'),('200'),('250-499'),('550-811'),('826-mismatched');
select *
from lan
where allowedvan = '600'
or
(instr(allowedvan,'-') > 0 and
'600' >= left(allowedvan,instr(allowedvan,'-')-1) and
'600' <= right(allowedvan,length(allowedvan)-instr(allowedvan,'-'))
)
这使用INSTR
来确定该值是否包含范围(连字符),然后使用LEFT
和RIGHT
来获取范围。不要使用LIKE
,因为这可能会返回不准确的结果(例如600就像1600)。
如果您无法更改数据库,那么可能会考虑使用拆分功能(SO上有几个帖子)然后您可以执行与上述方法类似的操作。