질문좀할게요! 0 2 497

by stussy [2020.02.17 15:11:10]


select * from

(

select
    '1번' name
    ,1 as a 
    , case when clo_cd is not null then 2 else 0 end as b
    , case when id = 'ACT' then 3 else 0 end as c
    , case when tas not in ('698','703') then 4 else 0 end as d
    , case when dttm < to_char(sysdate,yyyymmdd) then 5 else 0 end as e

from aaa

 union all

select  
    '2번' name
    ,1 as a
    , case when clo_cd is not null then 2 else 0 end as b
    , case when id = 'ACT' then 3 else 0 end as c
    , case when tas not in ('698','703') then 4 else 0 end as d
    , case when dttm < to_char(sysdate,yyyymmdd) then 5 else 0 end as e

from bbb

)
where 1=1
and  name =  '1번'   
and   'a' =  '1'
 

조건절은 and name=?

and ? = ?

이렇게 되어있습니다 저런게 많이 2번이상 반복되서 그 원하는 이름과 end 네임으로 각각 맞는걸 하나씩 뽑으려고하는게 최종목표인데

and a = '1' 이렇게되야하는데 a도 값을 파라메터로 넘기다보니 'a' 들어가는거같습니다 ㅠ 쉽게 해결방법없을까요?

쿼리자체가 잘못되어진거같기도하고 어렵네요

 

 

by 마농 [2020.02.17 15:26:50]

1. 바인드변수 처리는 값에 대해서 하는 것입니다.
 - 쿼리의 일부분(SQL구문, 테이블명, 컬럼명 등)을 바인드변수로 대체할 수 없습니다.
 - 버인드 변수 처리가 아닌 문자열로 연결하여 붙이셔야 합니다.
2. 바인드변수로 처리하려면
 - AND DECODE(:v_col, 'a', a, 'b', b, 'c', c, 'd', d, 'e', e) = :v_val
3. SQL 이 좀 복잡하네요.
 - 왜 이렇게 복잡하게 짰는지?
 - 그 작성 의도를 알아야 개선이 가능할 듯 합니다.


by stussy [2020.02.17 16:21:21]

5개 테이블에 그 테이블마다 5개의 컬럼을 뽑아내야해서 그런듯한데 애초에 베이스로 저런식으로 union all로 되어있는바람에 저도 저렇게하긴했는데 굉장히 불편하긴한데 딱히 다른방법이떠오르질...ㅠㅠ 우선 고민고민하다가 and or절로 계속 반복시켜서 해결하긴했는데 되게 지저분하네요 ㅎㅎ

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