2013-05-22 86 views
0

SQL SELECT查詢給定列的行數據中的多個值和範圍。SQL SELECT查詢列中的多個值和範圍

問題描述:

服務器:MySQL的
數據庫:Customer
表:Lan
柱:Allowed VLAN(範圍1-4096)

一個行中的列具有數據如下Allowed VLAN
180,181,200,250-499,550-811,826-mismatched

我需要一個SELECT聲明WHEREAllowed 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子句中的數據範圍。我已經使用explode()分割函數等解決了PHP代碼的問題,但我認爲有一些SQL SELECT解決方案。

我將不勝感激的任何幫助。

+1

我可以給你的最好的建議是修復你的數據結構。允許的值應該在一個單獨的表格中,每個範圍或單獨的值有不同的行。 –

+0

是的,這是正確的,數據結構很奇怪。數據庫設計不是我的,來自客戶端,不能確定他們是否會改變它。 – user2409597

回答

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 Fiddle Demo

這使用INSTR來確定值是否包含範圍(連字符),然後使用LEFTRIGHT來獲取範圍。請勿使用LIKE,因爲這可能會返回不準確的結果(例如,600就是1600)。

如果你不能改變你的數據庫,那麼可以看看使用分割函數(SO上的幾個帖子),然後你可以做類似於上面的方法。

+0

謝謝@sgeddes這個解決方案,數據庫設計來自客戶端,所以不知道他們是否會跟着爲什麼要改變數據結構。當然,我必須嘗試將該解決方案與分割功能混合使用。此外,謝謝提及** LIKE **誤用。 – user2409597