以下のような条件付きの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
以下のような条件付きの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
WHERE
条項にこれが必要なようです。
WHERE
(
b.kurum_turu = 1
AND u.kod in ('1125', '2975', '1127', '4460', '1128', '1126')
)
OR
(
u.kod in ('1125', '2975')
)
あなたはそれを次のように書き直すことができます
...
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'))
)
これがあなたに必要なものだと思います。
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
私のアプローチはこれです:
AND 1 = CASE
WHEN b.kurum_turu = 1 AND u.kod in ('1125', '2975', '1127', '4460', '1128', '1126') THEN 1 ELSE 1 END
条件文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
)
)
これには、コンマで区切られた値のデータ行への変換が少し複雑であるという欠点があります...しかし、この複雑さを隠すために、この複雑な部分を適切な名前の関数に抽出できます。