오라클 IN 을 사용할 때 특정 조건일경우 2개의 조건이 되어야 된다면 어떻게 해야 되나요? 0 8 752

by 권오창 [2019.07.10 15:26:16]


30 일경우 P1, P2가 되어야 되고

31일경우 P3

32일경우 P4

이렇다고 한다면

 

select

    *

from POWER

where factory IN (case when x = 30 then 'P1,P2'

                            when x = 31 then 'P3'

                            when x = 32 then 'P4' END)

 

저 case 부분을 어떻게 해야 되는지 모르겠습니다.

IN (CONCAT(CONCAT('''P5''', CHR(44)), '''P6''')) 도 해보고 ||로 합쳐도 봤는데 

이래저래 찾아도 보고 쿼리도 실행해보고 했는데 어떻게 해야 되는지 찾다가 몰라서요 ㅠㅠ

by 마농 [2019.07.10 15:48:23]

x 가 뭔가요? 컬럼인가요? 변수인가요?


by 권오창 [2019.07.10 15:50:25]

변수입니다. 30 31 32등등의 수치가 파라미터로 받아집니다


by 우리집아찌 [2019.07.10 15:55:49]

or를 사용하세요


by 마농 [2019.07.10 15:56:10]
SELECT *
  FROM power
 WHERE factory IN ( DECODE(:x, 30, 'P1')
                  , DECODE(:x, 30, 'P2', 31, 'P3', 32, 'P4')
                  )
;

SELECT *
  FROM power
 WHERE ( ( :x = 30 AND factory IN ('P1','P2') )
      OR ( :x = 31 AND factory = 'P3' )
      OR ( :x = 32 AND factory = 'P4' )
       )
;

SELECT *
  FROM power
 WHERE CASE WHEN :x = 30 AND factory IN ('P1','P2') THEN 1
            WHEN :x = 31 AND factory = 'P3'         THEN 1
            WHEN :x = 32 AND factory = 'P4'         THEN 1
            ELSE 0 END = 1
;

SELECT *
  FROM power
 WHERE factory IN (SELECT f
                     FROM (SELECT 30 gb, 'P1' f FROM dual
                           UNION ALL SELECT 30, 'P2' FROM dual
                           UNION ALL SELECT 31, 'P3' FROM dual
                           UNION ALL SELECT 32, 'P4' FROM dual
                           )
                    WHERE gb = :x
                   )
;

SELECT *
  FROM power
 WHERE (:x, factory) IN ( (30, 'P1')
                        , (30, 'P2')
                        , (31, 'P3')
                        , (32, 'P4')
                        )
;

 


by jkson [2019.07.10 16:04:54]

1번이 깔끔하고 왠지 성능도 좋을 것 같네요.


by 권오창 [2019.07.10 16:03:56]

뭐...뭐지요 

쿼리보니 이해는 갑니다... 근데 뭔가 머리에 떵하고 때리는거 같은 느낌이 듭니다

저런 생각을 전 왜 못했을까요 ㅠㅠ


by 러드 [2019.07.10 19:01:04]

regexp_like ( 

case when x = 30 then 'P1,P2'

                            when x = 31 then 'P3'

                            when x = 32 then 'P4' END, factory) 

오라클 버전이 11인가? 부터 가능 할꺼에요^^


by 러드 [2019.07.10 19:08:08]

모발일 이라 그런지 이수정이 안되네요. 오라클 10부터 가능하네요.

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