A테이블
| A컬럼 |
| ABC_A |
| ACC_A |
| AC_A |
| BAC_A |
| BAA_C |
| CC_A |
B테이블
| B테이블 A컬럼 | B테이블 B컬럼 | B테이블 C컬럼 |
| ABC | 감자 | 강원도 |
| ACC | 고구마 | 강원도 |
| ACC | 사과 | 충청도 |
| BAC | 딸기 | 충청도 |
| BAA | 포도 | 서울 |
| CC | 포도 | 서울 |
A와 B를 조인할때 A의 A컬럼에 B테이블의 A컬럼 LIKE 문으로 조인을 걸어오고싶은데
앞자리가 2개 3개 유동적입니다 이경우 어떻게 해야하나요
뒷자리는 1자리 고정인가요?
B 에 ACC 가 두개인데? 하나는 AC 일 것 같네요.
1.뒷자리도 여러자리로 유동적입니다 ㅠ
2. 맞습니다.
WITH TA AS ( SELECT 'ABC_A' A_A FROM DUAL UNION ALL SELECT 'ACC_A' A_A FROM DUAL UNION ALL SELECT 'AC_A' A_A FROM DUAL UNION ALL SELECT 'BAC_A' A_A FROM DUAL UNION ALL SELECT 'BAA_C' A_A FROM DUAL UNION ALL SELECT 'CC_A' A_A FROM DUAL ) , TB AS ( SELECT 'ABC' B_A , '감자' B_B, '강원도' B_C FROM DUAL UNION ALL SELECT 'ACC' B_A , '고구마' B_B, '강원도' B_C FROM DUAL UNION ALL SELECT 'ACC' B_A , '사과' B_B, '충청도' B_C FROM DUAL UNION ALL SELECT 'BAC' B_A , '딸기' B_B, '충청도' B_C FROM DUAL UNION ALL SELECT 'BAA' B_A , '포도' B_B, '서울 ' B_C FROM DUAL UNION ALL SELECT 'CC' B_A , '포도' B_B, '서울 ' B_C FROM DUAL ) SELECT * FROM TA, TB WHERE INSTR(TA.A_A, TB.B_A) > 0; 이렇게 하면 되지 않을까요?
WITH ta AS
(
SELECT 'ABC_A' a FROM dual
UNION ALL SELECT 'ACC_A' FROM dual
UNION ALL SELECT 'AC_A' FROM dual
UNION ALL SELECT 'BAC_A' FROM dual
UNION ALL SELECT 'BAA_C' FROM dual
UNION ALL SELECT 'CC_A' FROM dual
)
, tb AS
(
SELECT 'ABC' a, '감자' b, '강원도' c FROM dual
UNION ALL SELECT 'ACC', '고구마', '강원도' FROM dual
UNION ALL SELECT 'AC' , '사과' , '충청도' FROM dual -- ACC가 중복이라 AC 로 바꿈.
UNION ALL SELECT 'BAC', '딸기' , '충청도' FROM dual
UNION ALL SELECT 'BAA', '포도' , '서울' FROM dual
UNION ALL SELECT 'CC' , '포도' , '서울' FROM dual
)
SELECT *
FROM ta a
, tb b
-- WHERE a.a LIKE b.a || '_%' -- LIKE 오답
WHERE a.a LIKE b.a || '#_%' ESCAPE '#' -- ESCAPE
-- WHERE INSTR(a.a, b.a) = 1 -- INSTR 오답
-- WHERE INSTR(a.a, b.a || '_') = 1 -- INSTR
-- WHERE SUBSTR(a.a, 1, INSTR(a.a, '_') - 1) = b.a -- 잘라서 비교
-- WHERE REGEXP_LIKE(a.a, '^' || b.a || '_.+') -- 정규식
;