서브쿼리로 들어오는 Replace 함수에 대해 여쭙습니다. 0 3 1,940

by co_fair [SQL Query] [2014.06.18 19:21:51]


사이트에서 개발중에 다음의 쿼리가 다른 결과를 나타내는 것을 알게 되었습니다.

우선 쿼리 먼저 올리겠습니다.

 

---------------------------------------------------------------------------------------------------

<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는 차이가 있다는 건데

해결방안을 떠나서 왜 두 쿼리의 결과가 차이가 나는지 설명해주시면 감사하겠습니다....

 

정말 답답해서 미칠것 같아요...( 오늘 오후 다 날려먹음.......)

부탁드리겠습니다. 긴 글 끝까지 읽어주셔서 감사합니다.

 

by 손님 [2014.06.18 22:03:13]
Case1 : 입력값이 3개입니다.
Case2 : 입력값이 1개입니다.
컴마와 따옴표를 포함하는 하나의 긴 문자열일 뿐입니다.

by 아발란체 [2014.06.18 22:34:29]

Dynamic-SQL이 아닌 이상 CASE2는 CASE1처럼 질의를 변경 할 수 없습니다.

XML 바인딩 처리 될 것 같은데 myBatis, iBatis를 쓰신다면 값을 어플에서

params = "''11', '22', '33'";  식으로 문자열을 정의하여 값을 넘겨주고

XML에서는 상수로 받으면 처리 됩니다.

아니면 말씀하신 DBIO를 직접 만드신 것이 아니라면 대부분 반복 처리를 지원합니다.

배열로 인자 값을 받아 반복하여 IN안에 들어가는 변수를 배열수 만큼 자동으로 만들어 주는 기능이 대부분 있습니다.


by DarkBee [2014.06.18 22:50:26]

''''||REPLACE('11,22,33', ',' , ''',''')||'''' 암만 바꿔봐야 하나의 스트링일뿐입니다.

 

참조하세요..

 

http://www.gurubee.net/article/62721#comment_117808

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