SQL문장 (LIKE) 수정 0 4 1,536

by 강은경 [2012.05.21 15:59:13]


다음과 같이 조건절에 LIKE를 사용해서 일자의 6자리까지만 비교하는 SQL문장이 있습니다.
-------------------------------------------------------------------------------------------------------------------------------

    SELECT
   C.col1
  ,C.col2
  ,MAX(GREATEST(A.TOT_AMT))  AS  TOT_AMT
    FROM   TABLE_C C,   
   TABLE_A A   
    WHERE  A.col1 = C.col1    
    AND    A.YYMMDD  LIKE SUBSTR(C.LST_YMD,1,6)||'%'   
    GROUP BY C.col1, C.col2
-------------------------------------------------------------------------------------------------------------------------------


A.YYMMDD  LIKE SUBSTR(C.LST_YMD,1,6)||'%' 
--> 그런데 LIKE뒤에 string이나 PROC의 호스트 변수 말고 저렇게 컬럼명이 오는 것을
DB2에서는 허용을 하지 않아서 다른 방법을 생각해야 하는데 도무지 떠오르지가 않습니다.
즉 이렇습니다.
    A.YYMMDD  LIKE SUBSTR('20120520', 1,, 6)||'%'    (OK)
A.YYMMDD  LIKE SUBSTR(:yyyymmdd, 1, 6)||'%'    (OK)
A.YYMMDD  LIKE SUBSTR(C.LST_YMD,1,6)||'%'    (ERROR)


A.YYMMDD를 substr(A.YYMMDD, 1, 6)으로 만들어서 LIKE대신 =연산을 할까 했지만 인덱스를 사용해야 해서 곤란하고요.
어떤 방법이 있을까요?
by 마농 [2012.05.21 17:54:57]

될지 안될지는 모르겠지만 일단...
AND a.yymmdd BETWEEN SUBSTR(c.lst_ymd,1,6)||'01' AND SUBSTR(c.lst_ymd,1,6)||'31'
또는
AND a.yymmdd >= SUBSTR(c.lst_ymd,1,6)||'01'
AND a.yymmdd <= SUBSTR(c.lst_ymd,1,6)||'31'


by 강은경 [2012.05.22 22:53:17]

이거 가지고 막막해서 얼마나 고민을 했는지...^^;
BETWEEN 비교의 시작일을 '01'로 하고 마지막날은 last_day() 등을 써서 구해서 사용하면 되겠네요.
저의 하루를 가볍게 해주셔서 감사합니다. ^^

by 마농 [2012.05.23 08:00:17]

굳이 Last_Day 까지 하실 필요 없습니다.
그냥 '31' 로 비교해도 됩니다.


by 강은경 [2012.05.23 23:01:54]

그게... 제가 위에 예문에서 간단하게 하느라고 컬럼이 char(8)인 것처럼 써놨는데요,
실제 테이블에서는 timestamp 컬럼이라 다시 TO_DATE()함수를 써서 변환해서 비교해야 하는데,
TO_DATE()함수에 없는 일자(20120231처럼요..)를 넣으면 에러가 나더라고요...
암튼 저 BETWEEN~ AND를 사용하니 잘 됩니다!!! ^^
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입