컬럼 다중데이터 쿼리 질문드립니다(질문수정) 1 11 1,620

by 이용범 [MySQL] mysql 쿼리 검색 [2016.03.09 15:50:43]


안녕하세요!

처음 가입하자마자 글을 쓰게되었습니다.

 

테이블 형태

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. 질문글을 너무 애매모호하게 써서 수정했습니다

by swlee710 [2016.03.09 15:53:33]
SELECT * 
  FROM test 
 WHERE (code like '%01%' and code like '%02%') 
    or code like '%11%';

 


by 이용범 [2016.03.09 15:55:19]

답변감사합니다. 질문 내용이 조금 빈약했네요ㅠ

컬럼에 코드화되어 관리된다는건 그 코드갯수의 최소/최대 값이 알수없을정도로 동적이란 의미입니다.

코드 조건이 2개일수도 있고 3개일수도 있고 4개일수도 있고 동적으로 되어있습니다.

하이버네이트나 mybatis 를 이용해서 파라미터를 전달하는 식으로 한다면 min/max 갯수를 지정할 수 없을경우에는 위처럼 사용은 못할것 같습니다.

 

다른방법이 없을까요?


by terry0515 [2016.03.09 16:11:41]

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')                                          
   ---쿼리끝---


by 이용범 [2016.03.09 17:40:27]

답변 정말감사드립니다!

제가 mysql 을 사용중이긴하지만 참고해보도록 하겠습니다!


by 마농 [2016.03.09 16:15:27]

질문을 보면 중의적으로 해석될 수 있는 모호한 부분이 많네요.
테이블 원본이
데이터가 5개라는 의미인지?
1개 컬럼에 컴마로 연결된 문자열이 들어 있다는 건지?


자료 예시를 표형태로 제시해 주세요.
1. 테이블 원본 예시
2. 검색조건 예시
3. 검색 조건에 따른 결과 예시


by 이용범 [2016.03.09 17:46:18]

부실하게 작성해서 죄송합니다.

질문 내용을 수정하였습니다!


by 창조의날개 [2016.03.09 16:39:23]
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만 넣으면 모두 다 나오겠네요..

변수에 코드 구분은 ,로 합니다.


by swlee710 [2016.03.09 16:45:55]

mysql사용하시는거 같아요


by 이용범 [2016.03.09 17:48:06]

답변정말 감사합니다!

제가 mysql 을 사용중이긴 하지만 많은 도움이 되었습니다!!


by 마농 [2016.03.09 17:54:02]

조건은 최대 몇개까지 들어올 수 있을까요?


by 이용범 [2016.03.09 17:57:44]

조건은 많아봐야 99개 이내일것같습니다!

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입