4

以下のような条件付きのwhere句を使用する必要がありますが、この句の有効なバージョンは何ですか?

AND CASE WHEN b.kurum_turu = 1 
         THEN u.kod  in ('1125', '2975', '1127', '4460', '1128', '1126')  
    ELSE u.kod  in ('1125', '2975')                 
END
4

5 に答える 5

10

WHERE条項にこれが必要なようです。

WHERE
(
  b.kurum_turu = 1
  AND u.kod  in ('1125', '2975', '1127', '4460', '1128', '1126')
)
OR
(
  u.kod  in ('1125', '2975') 
)
于 2012-12-19T11:51:14.153 に答える
2

あなたはそれを次のように書き直すことができます

...
WHERE
    (
        (b.kurum_turu = 1 AND u.kod in ('1125', '2975', '1127', '4460', '1128', '1126'))
        OR
        ((b.kurum_turu IS NULL OR b.kurum_turu != 1) AND u.kod in ('1125', '2975'))
    )
于 2012-12-19T11:54:53.617 に答える
2

これがあなたに必要なものだと思います。

 where ...AND CASE WHEN b.kurum_turu = 1 
         and u.kod  in ('1125', '2975', '1127', '4460', '1128', '1126') then 1  
         when  u.kod  in ('1125', '2975') then 1
     else 0      
END=1
于 2012-12-19T11:57:37.967 に答える
0

私のアプローチはこれです:

 AND 1 = CASE
         WHEN  b.kurum_turu = 1 AND u.kod  in ('1125', '2975', '1127', '4460', '1128', '1126') THEN 1 ELSE 1 END
于 2017-07-05T13:48:10.063 に答える
0

条件文CONNECT BYを取得するためにを使用して文字列のリストを変換します。IN

INこのソリューションは、他のAND、OR制限なしで句を単一の式として記述できるため、サーバー条件がある場合に役立ちます。

WHERE u.kod IN 
(
  SELECT rowdata FROM
  ( WITH DATA AS 
    (SELECT CASE WHEN b.kurum_turu = 1 THEN '1125, 2975, 1127, 4460, 1128, 1126' ELSE '1125, 2975' END rowdata FROM dual )
    SELECT trim(regexp_substr(rowdata, '[^,]+', 1, LEVEL)) rowdata FROM DATA CONNECT BY instr(rowdata, ',', 1, LEVEL - 1) > 0
  )
)

これには、コンマで区切られた値のデータ行への変換が少し複雑であるという欠点があります...しかし、この複雑さを隠すために、この複雑な部分を適切な名前の関数に抽出できます。

于 2018-11-21T17:57:32.243 に答える