2
Appr_ID   Status
----------------
Null      1
3         2
4         3
NULL      4
7         5
NULL      6

上記のような値を持つテーブルに 2 つの列があります。

ストアド プロシージャを記述して、Appr_ID列に Not Null 値が含まれるたびに、複数の結合を使用して特定のテーブルからデータをフェッチして表示する必要があります。

Appr_ID列が NULL の場合、データをフェッチして表示するには、いくつかの異なる条件を使用する必要があります。

私の問題は、if-elseステートメントを使用しようとすると、 if ステートメントの条件として列の値を使用できないことです。

If Appr_ID is Null then
  Select...
Else
  Select...

そのため、シナリオを達成するための別のアイデアを提案してください。

前もってありがとう、クリシュナ

4

3 に答える 3

0

1 つのステートメントで実行する必要がある場合は、両方の結合を実行してから CASE .... WHEN を使用して、出力で使用する列を決定します。

私が意味することの簡単な例: -

SELECT a.*, CASE WHEN a.somefield IS NULL THEN b.somefield ELSE c.someotherfield END AS OutputField
FROM SomeTable a
LEFT OUTER JOIN SecondTable b ON a.somefield = b.id
LEFT OUTER JOIN ThirdTable c ON a.somefield = c.id
于 2013-04-24T10:39:30.090 に答える
0

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 によって評価/最適化/実行されて、まったく同じになる可能性があります (この場合、最も理にかなった構文パターンを選択してください)あなた!) :-)

于 2013-04-24T10:39:45.830 に答える