안녕하세요!
처음 가입하자마자 글을 쓰게되었습니다.
테이블 형태
idx | name | code |
1 | 과일상점1 | 01,02,03 |
2 | 과일상점2 | 06,04,02,01 |
3 | 과일상점3 | 03,02,01 |
4 | 과일상점4 | 06 |
5 | 과일상점5 | 04,06 |
위와 같이 테이블이 구성되어있고, 데이터가 들어있습니다.
code 는 과일의 종류이구요( 01 = 배 , 02 = 사과 , 03 = 귤 등등 )
목적은 판매중인 과일종류를 code로 만들어놓고 넣어두고 있습니다
그럼 여기서 01(배) 를 팔고있는 상점정보를 가져오기 위해 쿼리를 아래처럼 했더니 결과가 나오지 않네요
SELECT * FROM test WHERE code IN ('01','02');
예상결과는 아래와 같습니다. ( code 05,06 가 들어있는 과일상점을 조회하려고 한경우 )
과일상점2 , 과일상점5 가 결과로 나와야 합니다.
DB는 mySQL 5.6.x 사용중입니다!
감사합니다.
ps. 질문글을 너무 애매모호하게 써서 수정했습니다
답변감사합니다. 질문 내용이 조금 빈약했네요ㅠ
컬럼에 코드화되어 관리된다는건 그 코드갯수의 최소/최대 값이 알수없을정도로 동적이란 의미입니다.
코드 조건이 2개일수도 있고 3개일수도 있고 4개일수도 있고 동적으로 되어있습니다.
하이버네이트나 mybatis 를 이용해서 파라미터를 전달하는 식으로 한다면 min/max 갯수를 지정할 수 없을경우에는 위처럼 사용은 못할것 같습니다.
다른방법이 없을까요?
with 구문으로 해당컬럼을 임시테이블형태로 분리해서 사용하시면 될듯한데요?
기존 테이블과 with구문으로 컬럼 분리한 테이블 join 해서 처리하면 됩니다.
오라클은 안써봐서..mssql 로 쿼리 작성해봤습니다.
---쿼리시작---
;with test(code) As
(
Select '01,02,11,21,05'
)
,code(cd,p_cd,l_cd) As
(
Select SubString(a.code,1,Charindex(',',a.code) -1 )
,a.code
,SubString(a.code,Charindex(',',a.code) +1,Len(a.code))
From test a
Where Charindex(',',a.code) <> 0
Union All
Select SubString(a.l_cd,1,Charindex(',',a.l_cd) -1 )
,a.p_cd
,SubString(a.l_cd,Charindex(',',a.l_cd) +1,Len(a.l_cd))
From code a
Where Charindex(',',a.l_cd) <> 0
)
,code2(cd,p_cd,l_cd) As
(
Select
a.cd
,a.p_cd
,a.l_cd
From code a
Union All
Select
a.l_cd
,a.p_cd
,''
From code a
Where a.l_cd Not Like '%,%'
)
Select a.code
From test a
Left Outer Join
code2 b
On a.code = b.p_cd
Where b.cd In ('01','02')
---쿼리끝---
답변 정말감사드립니다!
제가 mysql 을 사용중이긴하지만 참고해보도록 하겠습니다!
부실하게 작성해서 죄송합니다.
질문 내용을 수정하였습니다!
WITH T(SEQ, A) AS ( SELECT 1, '01,02,11,11,15' FROM DUAL UNION ALL SELECT 2, '01,22,21,21,05' FROM DUAL UNION ALL SELECT 3, '01,02,11,21,05' FROM DUAL ) SELECT MAX(T1.A) A FROM T T1 , (SELECT REGEXP_SUBSTR (TXT, '[^,]+', 1, LEVEL ) TXT FROM (SELECT :TXT TXT FROM DUAL) CONNECT BY LEVEL <= REGEXP_COUNT(:TXT,',') + 1) T2 GROUP BY SEQ HAVING SUM(SIGN(INSTR(T1.A,T2.TXT))) = REGEXP_COUNT(:TXT,',') + 1 ;
WITH문으로 데이터 테이블을 T로 봅니다.
:TXT로 변수를 받습니다.
01,02가 들어오면 SEQ값이 1,3이 나올테고
01만 넣으면 모두 다 나오겠네요..
변수에 코드 구분은 ,로 합니다.
답변정말 감사합니다!
제가 mysql 을 사용중이긴 하지만 많은 도움이 되었습니다!!
조건은 많아봐야 99개 이내일것같습니다!