2013-05-22 2 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() split 함수 등을 사용하여 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를 주셔서 감사합니다. 데이터베이스 구조가 고객 측에서 나오므로 데이터 구조를 변경해야하는 이유는 확실하지 않습니다. 확실히이 솔루션을 분할 기능과 함께 사용해야합니다. ** 잘못된 사용에 대해 언급 해 주셔서 감사합니다. – user2409597

관련 문제