Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql SQL SELECT查询列中的多个值和范围_Mysql_Sql_Where Clause_Between_Range - Fatal编程技术网

Mysql SQL SELECT查询列中的多个值和范围

Mysql 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

SQL SELECT查询给定列的行数据中的多个值和范围

问题描述:

服务器:MySQL
数据库:
客户

表:
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,'-')) 
      )