CASE
ステートメントを使用する必要があります。
例えば:
SELECT
CASE
WHEN Appr_ID IS NULL THEN (
SELECT somevalue
FROM sometable
JOIN ...
JOIN ...
WHERE something=something)
ELSE (SELECT somevalue
FROM someothertable
JOIN ...
JOIN ...
WHERE something=something)
END as Your_Result_ColumnName
FROM
YourTableWithApprIDInIt
YourTableWithApprIDInIt
これは、各サブクエリが基本的にメインテーブルの値に関係なく同じ結果を返す場合(例:Appr_ID
自分自身)、非常に効率的です。これは、サブクエリが実際には行ごとに何度も実行されないためです。その結果は DBMS によってキャッシュされ、各行で再利用されます。
ただし、サブクエリが依存している場合Appr_ID
(各サブクエリを各行で再実行する必要があるなど)、サブクエリを使用するのではJOIN
なく、(メインFROM
句で) 代わりに a を使用する可能性があります。
SELECT
CASE
WHEN a.Appr_ID IS NULL THEN b.somevalue
ELSE c.somevalue
END as Your_Result_ColumnName
FROM
YourTableWithApprIDInIt a
JOIN sometable b ON a.x = b.x
JOIN ... ON ..
JOIN someothertable c ON a.x = c.x
JOIN ... ON ..
必要に応じて、このシナリオでもサブクエリを使用できますが、それほどクリーンではない可能性があります (また、DBMS が複数の論理的にばらばらの結果セットを処理するため、効率が低下する可能性があります。これは適切に)。
特定のシナリオでテストして、あるアプローチが他のアプローチよりも優れた結果をもたらすかどうかを確認します。パフォーマンスが要因でさえある場合。
アップデート:
値が null であるかどうかに応じて複数の値を選択する必要がある場合は、メイン クエリの各列に対してステートメントAppr_ID
を繰り返す必要があります。case
SELECT
CASE
WHEN Appr_ID IS NULL THEN (
SELECT somevalue_1
FROM sometable_1
JOIN ...
JOIN ...
WHERE something=something)
ELSE (SELECT somevalue_1
FROM someothertable_1
JOIN ...
JOIN ...
WHERE something=something)
END as Your_Result_ColumnName_1,
CASE
WHEN Appr_ID IS NULL THEN (
SELECT somevalue_2
FROM sometable_2
JOIN ...
JOIN ...
WHERE something=something)
ELSE (SELECT somevalue_2
FROM someothertable_2
JOIN ...
JOIN ...
WHERE something=something)
END as Your_Result_ColumnName_2,
...
FROM
YourTableWithApprIDInIt
または
SELECT
CASE
WHEN a.Appr_ID IS NULL THEN b.somevalue_1
ELSE c.somevalue_1
END as Your_Result_ColumnName_1,
CASE
WHEN a.Appr_ID IS NULL THEN b.somevalue_2
ELSE c.somevalue_2
END as Your_Result_ColumnName_2,
...
FROM
YourTableWithApprIDInIt a
JOIN sometable b ON a.x = b.x
JOIN ... ON ..
JOIN someothertable c ON a.x = c.x
JOIN ... ON ..
これは、結合構文が本当にきれいに見え始めたときです...しかし、繰り返しになりますが、それぞれYour_Result_ColumnName_X
の が異なるテーブルから来ており、これらのサブクエリのそれぞれがメインの外側のクエリ内の値に依存していない場合 (それぞれが1 回だけ評価する必要があります)、2 つのパターンのうち最初のパターンは、きれいに見えませんが、より効率的かもしれません ;-)
ただし、特定のシナリオで両方をテストして、違いがあるかどうかを確認します。DBMS によって評価/最適化/実行されて、まったく同じになる可能性があります (この場合、最も理にかなった構文パターンを選択してください)あなた!) :-)