mysql 구분자 검색 질문드립니다. 0 8 218

by 밍밍밍밍 mysql 구분자 [2021.08.25 11:31:55]


A테이블

gubun reg_user
01@02@05 test1

 

 

B테이블

seq gubun reg_user reg_date
1 01 test1 2021-08-25
2 02 test1 2021-08-25
3 06 test1 2021-08-25

 

안녕하세요.

B테이블을 A테이블의 구분값을 참조해서 조회하려고합니다.

예를 들어 B테이블에 06이 있는데 A테이블에는 06이 없어서 조회시 제외시키려고합니다.

구분자로 되어있을경우 조회를 어떻게하면되는지 답변부탁드립니다.!

 

by 마농 [2021.08.25 13:03:10]

결과표가 어떻게 나와야 하는지?


by 밍밍밍밍 [2021.08.25 13:05:20]

B테이블 조회시 06로우만 제외되면 됩니다(A테이블에 06이 없기때문에요)


by 마농 [2021.08.25 13:06:26]
SELECT b.*
  FROM a_table a
 INNER JOIN b_table b
    ON a.reg_user = b.reg_user
   AND INSTR(a.gubun, b.gubun) > 0
;

 


by 우주민 [2021.08.25 13:09:23]

비슷한 기능을 하는 쿼리를 만들어보긴 했습니다.

SELECT B.*

FROM A_TABLE A

, B_TABLE B

WHERE A.REG_USER = B.REG_USER

AND FIND_IN_SET(B.GUBUN, A.GUBUN) ;

 

문제점은 A 테이블의 구분값의 일부가 B 테이블의 구분값이 될 경우도 검출 됨

A 테이블 구분값

02@05@001

 

B 테이블 구분값

01

일 경우에 매칭되지 않아야 하는데 위의 쿼리로는 매칭이 됨. 


by 마농 [2021.08.25 13:23:46]

FIND_IN_SET 함수는 처음 보네요.
위에 말씀하신 것과 달리 직접 테스트 해보니 001 과 01 을 정확하게 구별하네요.
다만, 구분자는 컴마(,) 여야만 히네요.
제가 예를 든 INSTR 의 경우는 001 과 01 을 구별하지 못합니다.
위 예시 자체가 코드값이 고정자리수인듯 하여 간략하게 표현했습니다.
가변 자리수인 경우엔 조건이 좀 더 복잡해지는데
FIND_IN_SET 함수를 이용하면 간편하겠네요.
 

SELECT b.*
  FROM a_table a
 INNER JOIN b_table b
    ON a.reg_user = b.reg_user
   AND INSTR(a.gubun, b.gubun) > 0 -- 고정 자리수 조건
   AND INSTR(CONCAT('@', a.gubun, '@'), CONCAT('@', b.gubun, '@')) > 0 -- 가변 자리수 조건
   AND FIND_IN_SET(b.gubun, REPLACE(a.gubun, '@', ',')) > 0
;

 


by 우주민 [2021.08.25 15:48:48]

환경이 안되서 테스트는 못해봤는데 체크 감사드립니다.


by 마농 [2021.08.26 16:25:42]

새로운 기능을 알려주셔서 감사드립니다.


by 밍밍밍밍 [2021.08.25 13:29:55]

답변주신분들 감사합니다!

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