私はデータベース アプリケーション (Oracle 10g データベースに基づき、Delphi で記述) を「継承」しました。これは、次のようにいくつかの決定を行う必要があります。
Do Query1.
If the result set is empty, do Query2.
クエリはSELECT
、同じ出力列を持つクエリであり、入力 (FROM) と条件 (WHERE) が似ている場合 (ケース 1) と異なる場合 (ケース 2) があります。
ケース 1:違いがcol like 'x'
(または col = 'x') になる場合がありcol like '%'
ます。
- パフォーマンス: おそらく、2 つの異なるクエリ (およびそれを使用しないクエリ) を使用するのが最善でしょう
col = 'x'
。 - 保守性:
col like :param
2 つのクエリを必要としないので優れています。 - 妥協案:
AND (col = 'x' OR :param = 1)
ケース 2:別の機会に、Query1 の結果セットにデータがない場合、完全に異なる Query2 を使用する必要があります。
stackoverflowとインターネットの検索から、私の問題に対するいくつかの解決策を認識しています。
2 つの SQL クエリを使用する: データベースの代わりにプログラムに作業を任せます (ただし、データベースを 1 回だけではなく 2 回クエリする必要があります)。
result = executeQuery(Query1) if (isEmpty(result)) result = executeQuery(Query2)
UNION の使用: Oracle にすべての作業を任せます (ただし、Query1 を 2 回実行する必要があります)。
Query1 UNION ALL Query 2 WHERE NOT EXISTS (Query 1)
PL/SQL の使用: Oracle にほとんどの作業を任せます (ただし、この方法で毎回クエリがコンパイルされることをどこかで読みました)。
begin Query1; exception when no_data_found then Query2; end;
私の質問は次のとおりです。
- 他の(より良い)解決策はありますか?
- (私よりも経験豊富なデータベース ユーザーとして) 何を使用しますか?
- (欠点)利点は何ですか?
- 注意事項は何ですか?