조건절의 다중컬럼 비교에 대한 질문입니다 0 5 1,235

by 김코옹 [SQL Query] [2016.03.07 18:13:31]


안녕하세요

오라클 다중컬럼 비교에 대한 질문 드립니다.

회원정보 테이블에 '연락처1','연락처2','연락처3' 이런식으로 회원의 연락처를 3개까지 관리합니다.

휴대전화번호, 일반전화 등을 구분없이 3개까지만 관리할 목적이구요..

화면의 조회조건에는 '연락처'라는 입력박스 한개만 존재해서 사용자가 번호를 입력하고 조회하면

연락처1,2,3 중 해당되는 데이터를 보여주고자 합니다.

 

예를 들어

연락처1: 010-1234-5678

연락처2: 02-5678-0099

연락처3: 031-789-1456

홍길동이라는 회원의 연락처가 위와 같이 저장되어있는경우, 화면에서 '0099' 만 입력했을때 홍길동이 조회되도록

하고싶습니다.

제가 아는 방법은

SELECT *

  FROM TABLE

WHERE (TEL_1 LIKE '%0099%') OR (TEL_2 LIKE '%0099%') OR (TEL_3 LIKE '%0099%') ;

 

이런 방법이 조회속도에 영향을 많이 줄것같은데 혹시 좀더 효율적인 방법이 있는지 궁금합니다.
 

 

 

 

by 낭만캐치 [2016.03.07 18:28:58]

SELECT CASE
          WHEN col1 LIKE '%'||:PhonNum||'%'
             THEN col1
          WHEN col2 LIKE '%'||:PhonNum||'%'
             THEN col2
          WHEN col3 LIKE '%'||:PhonNum||'%'
             THEN col3
       END
  FROM TABLE

 


by 김코옹 [2016.03.07 18:38:30]

낭만캐치님 답변 감사합니다.

제가 실력부족하다보니 댓글에 적어주신 쿼리가 어떤점이 좋은지 잘 모르겠는데 혹시 간단하게 설명해주실수 있을까요?


by 낭만캐치 [2016.03.07 18:55:47]

위와같은 내용의 CASE를 쓰면 테이블을 단 한번만 읽고 처리 할 수 있는 성능상 이점이 있습니다

해당 내용으로 작성후 실행계획을 확인해보세요~


by 겸댕2후니 [2016.03.08 09:18:39]

원글 작성자님의 쿼리도, 테이블을 한번 읽고 처리합니다.

단지 차이는 행을 걸러내고 가져오느냐, 가져와서 걸러내느냐의 차이가 있겠네요.


by 마농 [2016.03.07 20:53:59]

어차피 LIKE '%' 검색은 인덱스 범위검색이 불가능합니다.

3개 컬럼을 결합인덱스로 하여 인덱스 풀스캔을 유도하면 좋을 듯하네요.

OR 라서 잘못된 것은 없어 보입니다.

LIKE 대신 INSTR 을 이용하기도 합니다.

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