0

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-mismatched”范围的起始数字值。

SELECT * WHERE `Allowed VLAN`='600' OR `Allowed VLAN` LIKE '%600%' OR (`Allowed VLAN` BETWEEN '1-1' AND '1-4096');

我无法弄清楚如何使用 WHERE 子句处理数据范围。我已经使用explode() 拆分函数等解决了PHP 代码的问题,但我认为有一些SQL SELECT 解决方案。

我将不胜感激任何帮助。

4

1 回答 1

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

SQL 小提琴演示

这用于INSTR确定值是否包含范围(连字符),然后使用LEFTandRIGHT获取范围。不要使用LIKE,因为这可能会返回不准确的结果(例如 600 就像 1600)。

如果您无法更改数据库,那么也许可以考虑使用拆分功能(在 SO 上有几个帖子),然后您可以执行类似于上述方法的操作。

于 2013-05-22T14:34:16.740 回答