select 관련 질문드립니다. 0 4 374

by 보리 [SQL Query] [2019.01.18 10:44:05]


지금 조건에 따라 select의 where문을 바꿔주어야 하는데

지금 상황은 이러합니다.

특정 조건에 따라 한 컬럼의 값을 바꿔서 조회를 해야하는데 문제는

바뀌는 where 문이 where COUM_TEST is NULL 과 where COUM_TEST = 'T'일때를 나눠서 데이터를 가져와야하는데

하나가 null일때 조회를 해야해서 decode나 case문으로 분류할수가 없는데

이럴때 어떤 방법을 써야할까요?ㅠㅠ

by 마농 [2019.01.18 10:59:18]

특정 조건에 따라 Where 조건 부분이 달라지는 건가요?
특정 조건이 뭔지 보여주세요.


by 보리 [2019.01.18 11:04:42]
begin
  if F_CMMN_CDNM('A80400','COMM_IT02') = '1' then
    SELECT LECT_YEAR,LECT_SHTM,STNT_NUMB,PRAC_SHTM
      FROM cour019
      WHERE HAKS_NUMB IN(
        SELECT COUR011.HAKS_NUMB
          FROM cour011
          WHERE 1=1
          AND COUR011.TYPL_KRNM like '%현장실습%'
       )
        AND COUR019.PRAC_SHTM ='T'
        AND COUR019.LECT_YEAR = F_CMMN_CDNM('A80400','COMM_IT01')
        AND COUR019.LECT_SHTM = F_CMMN_CDNM('A80400','COMM_IT02');
  elsif F_CMMN_CDNM('A80400','COMM_IT02') = '2' then
    SELECT LECT_YEAR,LECT_SHTM,STNT_NUMB,PRAC_SHTM
      FROM cour019
      WHERE HAKS_NUMB IN(
        SELECT COUR011.HAKS_NUMB
          FROM cour011
          WHERE 1=1
          AND COUR011.TYPL_KRNM like '%현장실습%'
       )
        AND COUR019.PRAC_SHTM ='T'
        AND COUR019.LECT_YEAR = F_CMMN_CDNM('A80400','COMM_IT01')
        AND COUR019.LECT_SHTM = F_CMMN_CDNM('A80400','COMM_IT02');
    else
      SELECT LECT_YEAR,LECT_SHTM,STNT_NUMB,PRAC_SHTM
      FROM cour019
      WHERE HAKS_NUMB IN(
        SELECT COUR011.HAKS_NUMB
          FROM cour011
          WHERE 1=1
          AND COUR011.TYPL_KRNM like '%현장실습%'
       )
        AND COUR019.PRAC_SHTM is null
        AND COUR019.LECT_YEAR = F_CMMN_CDNM('A80400','COMM_IT01')
        AND COUR019.LECT_SHTM = F_CMMN_CDNM('A80400','COMM_IT02');
  end if;
end;

지금 이런식으로 시도는 하고있는데 조건값은 학기이고 바꾸고 싶은 부분은 COUR019.PRAC_SHTM is null 와 COUR019.PRAC_SHTM = 'T' 입니다.

F_CMMN_CDNM('A80400','COMM_IT02')는 학기를 가져오는 부분이고요

이런식으로 만들경우 into 로 넣어줘야하는데.. count로 해서 가져오기에는 저는 가져오고 싶은 값들이 많아서... 아직 많이 미숙하여 잘모르겠네요.. 

 


by 마농 [2019.01.18 11:19:29]
-- 함수가 매번 호출되는 것을 방지하기 위해 서브쿼리를 이용했습니다.
SELECT lect_year
     , lect_shtm
     , stnt_numb
     , prac_shtm
  FROM cour019
 WHERE haks_numb IN (SELECT haks_numb
                       FROM cour011
                      WHERE typl_krnm LIKE '%현장실습%'
                     )
   AND lect_year = (SELECT f_cmmn_cdnm('A80400', 'COMM_IT01') FROM dual)
   AND lect_shtm = (SELECT f_cmmn_cdnm('A80400', 'COMM_IT02') FROM dual)
-- 1. Case 를 이용하는 방법 --
   AND CASE WHEN lect_shtm IN ('1', '2')
            THEN CASE WHEN prac_shtm = 'T'   THEN 1 ELSE 0 END
            ELSE CASE WHEN prac_shtm IS NULL THEN 1 ELSE 0 END
        END = 1
-- 2. OR 조건을 이용하는 방법 --
   AND (  (lect_shtm     IN ('1', '2') AND prac_shtm = 'T'  )
       OR (lect_shtm NOT IN ('1', '2') AND prac_shtm IS NULL)
       )
-- 3. NVL 과 Case 사용하는 방법 --
   AND NVL(prac_shtm, 'x') = CASE WHEN lect_shtm IN ('1', '2') THEN 'T' ELSE 'x' END
;

 


by 보리 [2019.01.18 12:43:41]

정말 감사합니다....!!! 해결됐습니다.ㅠㅠ

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