사이트에서 개발중에 다음의 쿼리가 다른 결과를 나타내는 것을 알게 되었습니다.
우선 쿼리 먼저 올리겠습니다.
---------------------------------------------------------------------------------------------------
<Case 1>
WITH TTT AS (
SELECT '1' AAA, '1' BBB FROM DUAL
UNION
SELECT '2', '2' FROM DUAL
UNION
SELECT '3', '3' FROM DUAL
UNION
SELECT '4', '4' FROM DUAL
UNION
SELECT '5', '5' FROM DUAL
)
SELECT *
FROM TTT
WHERE TTT.AAA || TTT.BBB IN ('11', '22', '33')
;
(결과)
AAA || BBB
1 1
2 2
3 3
<Case2>
WITH TTT AS (
SELECT '1' AAA, '1' BBB FROM DUAL
UNION
SELECT '2', '2' FROM DUAL
UNION
SELECT '3', '3' FROM DUAL
UNION
SELECT '4', '4' FROM DUAL
UNION
SELECT '5', '5' FROM DUAL
)
SELECT *
FROM TTT
WHERE TTT.AAA || TTT.BBB IN (
SELECT ''''||REPLACE('11,22,33', ',' , ''',''')||'''' FROM DUAL
)
;
(결과)
표시할 데이터가 없습니다.
---------------------------------------------------------------------------------------------
기초적이라면 기초적일 수 있는데 정확히 개념을 잘 모르겠어서 알고 넘어가려고 글을 올리게 되었습니다.
Case2의 IN절에 들어가는 서브쿼리만 돌려보면 '11','22','33' 라는 Case1의 서브쿼리에 들어가는 값과 같게 셋팅됩니다.
원래는 프레임웍에서 변수에 셋팅해서 IN절에 넣으려 했는데
프레임웍단에서 DBIO로 넘어가는 중 (쿼리셋팅)에 자동적으로 VARCHAR타입은 ''로 감싸줘서 어쩔수 없이 DUAL로 받아서 처리하려고 하였습니다.
그래서 그 서브쿼리는 ''을 IN절에 맞게 셋팅을 하고 있고요(IN절에 들어가는 파라미터는 가변적입니다.)
근데 결과가 안나와서 하드코딩해보니 나오더라고요... 그럼 Case1과 Case2는 차이가 있다는 건데
해결방안을 떠나서 왜 두 쿼리의 결과가 차이가 나는지 설명해주시면 감사하겠습니다....
정말 답답해서 미칠것 같아요...( 오늘 오후 다 날려먹음.......)
부탁드리겠습니다. 긴 글 끝까지 읽어주셔서 감사합니다.