Mysql SQL SELECT查询列中的多个值和范围
SQL SELECT查询给定列的行数据中的多个值和范围 问题描述: 服务器:MySQLMysql SQL SELECT查询列中的多个值和范围,mysql,sql,where-clause,between,range,Mysql,Sql,Where Clause,Between,Range,SQL SELECT查询给定列的行数据中的多个值和范围 问题描述: 服务器:MySQL 数据库:客户 表:Lan 列:允许的VLAN(范围1-4096) 一行在允许的VLAN列中有如下数据: 180181200250-499550-811826-不匹配 我需要一个SELECT语句其中列允许的VLAN包括一个给定的数字,例如'600'。给定的数字'600'甚至是逗号分隔值之一,或包含在“250-499”、“550-811”范围内,或者它只是“826不匹配”范围的起始数字值 我不知道如何使用WHER
数据库:
客户
表:
Lan
列:
允许的VLAN
(范围1-4096)
一行在允许的VLAN
列中有如下数据:180181200250-499550-811826-不匹配
我需要一个SELECT
语句其中列允许的VLAN
包括一个给定的数字,例如'600'
。给定的数字'600'
甚至是逗号分隔值之一,或包含在“250-499”、“550-811”范围内,或者它只是“826不匹配”范围的起始数字值
我不知道如何使用WHERE子句处理数据范围。我已经使用explode()split函数等解决了PHP代码的问题,但我认为有一些SQL SELECT解决方案
非常感谢您的帮助。我强烈建议您规范化数据。将逗号分隔的项目列表存储在一行中通常不是一个好主意
假设你可以做出这样的改变,那么这样的事情应该为你工作(尽管你可以考虑将你的范围存储在不同的列中以使它变得更容易):
创建表lan(allowedvan varchar(100));
插入到lan值中
('180')、('181')、('200')、('250-499')、('550-811')、('826-mismatched');
挑选*
来自局域网
其中allowedvan='600'
或
(仪表(允许“-”)>0和
'600'>=左(允许,仪表(允许,'-')-1)和
“600”我能给你的最好建议是修改你的数据结构。允许的值应该在一个单独的表中,每个范围或单个值有不同的行。是的,这是正确的,数据结构很奇怪。数据库设计不是我的,来自客户方,无法确定他们是否会更改。谢谢@sgeddes对于这个解决方案,数据库设计来自客户端,因此不确定他们是否会遵循为什么要更改数据结构。当然,我必须尝试将这个解决方案与拆分功能混合使用。另外,感谢提及类似的误用。
SELECT * WHERE `Allowed VLAN`='600' OR `Allowed VLAN` LIKE '%600%' OR (`Allowed VLAN` BETWEEN '1-1' AND '1-4096');
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,'-'))
)