where절에 조건문 0 4 1,462

by 에브리데이나잇쇼 [2015.07.23 12:12:18]


  select a.sale_dt,
       a.store_cd,
       a.seq,
       a.prod_cd,
       a.color_cd,
       a.size_cd,
       a.sale_qty,
       a.sale_pr,
       a.sale_pt,
       a.wo_pr,
       a.sale_mn
  from tb_sl020 a, tb_si010 b
 where a.prod_cd = b.prod_cd
   and a.sale_dt like '201504%'
   and a.store_cd = 'NFW017'
   and ((fn_comm_csi010('19', b.yy_cd) = to_char(sysdate,       'yyyy') and b.season_pt in ('S', 'M', 'F', 'W', 'Y', 'N')) or
        (fn_comm_csi010('19', b.yy_cd) = to_char(sysdate - 365, 'yyyy') and b.season_pt in ('F', 'W') and substr(a.sale_dt, 5, 2) <= '04'))

 

 

빨간색 부분을 조건문을 주어서 store_cd = 'NFW017' 일경우만 돌아가게 하고 싶은데 어떤식으로 해야되나요?

by 아발란체 [2015.07.23 13:05:05]

요즘 딴것만 해서 SQL를 멀리해서 그른강.. ㅠㅠ

이미 그렇게 되어 있는 것 아닌가영?

조건에 "and a.store_cd = 'NFW017'" 게 있어서 말씀 하신 조건 일 때만 실행 됩니다. 뒤에 괄호도 잘 분리하여 묶으신거 같은데.... 허걱... 아닌가.. ㅡ ㅁ ㅡ)/


by jkson [2015.07.23 13:13:40]
 SELECT a.sale_dt
     , a.store_cd
     , a.seq
     , a.prod_cd
     , a.color_cd
     , a.size_cd
     , a.sale_qty
     , a.sale_pr
     , a.sale_pt
     , a.wo_pr
     , a.sale_mn
  FROM tb_sl020 a
     , tb_si010 b
 WHERE a.prod_cd = b.prod_cd
   AND a.sale_dt LIKE '201504%'
   AND (   (    a.store_cd = 'NFW017'
            AND (   (    fn_comm_csi010 ('19', b.yy_cd) = TO_CHAR (SYSDATE, 'yyyy')
                     AND b.season_pt IN ('S', 'M', 'F', 'W', 'Y', 'N'))
                 OR (    fn_comm_csi010 ('19', b.yy_cd) = TO_CHAR (SYSDATE - 365, 'yyyy')
                     AND b.season_pt IN ('F', 'W')
                     AND SUBSTR (a.sale_dt, 5, 2) <= '04'
                    )
                )
           )
        OR a.store_cd != 'NFW017'
       )

 

혹시 이걸 말씀하시는지요? 데이터가 nfw017일 때만 function 부분 실행하고 아닐 경우에는 그냥 select하고..


by DarkBee [2015.07.23 13:25:08]
이거일듯

and ( ( :변수 = 'NFW017' AND a.store_cd = :변수
   and ((fn_comm_csi010('19', b.yy_cd) = to_char(sysdate,       'yyyy') and b.season_pt in ('S', 'M', 'F', 'W', 'Y', 'N')) or
        (fn_comm_csi010('19', b.yy_cd) = to_char(sysdate - 365, 'yyyy') and b.season_pt in ('F', 'W') and substr(a.sale_dt, 5, 2) <= '04'))
    )
  OR ( :변수 != 'NFW017' AND a.store_cd = :변수
     )
  )

 


by 마농 [2015.07.23 13:55:45]

복잡한 조건을 간략화 하면
 AND (선행조건)
 AND (빨간조건)
이런 형태죠.
선행조건을 만족할 때만 빨간조건을 수행되도록 하고 싶다...
결과만 본다면 AND 조건이므로 두개 조건 모두 만족해야 하는 것은 맞습니다.


그런데 실행 순서까지 고려한 질문이라면?
즉 빨간 조건의 수행시간이 길어서 앞에서 어느정도 걸러낸 뒤
수행시간을 줄이고자 하는 목적일 수 있겠네요.


두개 조건이 동일 레벨에 있으므로 어느것이 먼저 수행될지는 모릅니다.
인덱스나 실행계획에 따라 조건 체크 순서가 달라질 수 있긴 한데...
그런거 다 무시하고 단순 비교하자면 보통 아래쪽 조건이 먼저 수행됩니다.
 AND (빨간조건)
 AND (선행조건)
요렇게 바꾸시면 해결 될수도 있는데...
이는 요행이라고 할 수 있습니다. 항상 그런게 아니므로


인라인뷰를 이용하는 방법도 있습니다.
 

SELECT ...
  FROM (SELECT ...
             , fn_comm_csi010('19', b.yy_cd) AS xxx
             --, ROWNUM rn
          FROM t
         WHERE (선행조건)
        )
 WHERE ( xxx 값을 이용한 빨간조건 )
;


그런데 여기서 또 문제는 쿼리변환기능입니다.
옵티마이져는 쿼리를 단순화 하려고 노력합니다.
인라인뷰를 없애버릴 가능성이 있습니다.
쿼리변환 중 뷰머징 기능입니다.
이렇게 뷰머징이 되면 인라인뷰 효과가 없죠.
뷰머징을 방지하기 위해 인라인뷰 안에 일부러 ROWNUM 을 넣기도 합니다.

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