0

私はこのようなことをするコードを持っています:

Search(for 'this' using 'a','b','c','d')
if result is not found
    search(for 'this' using null,'b','c','d')
    if result is not found
      ...
      if result is not found
           search(for 'this' using null,null,null,null)
 ...
return 

これは、自身を再帰的に呼び出すストアドプロシージャですが、パラメータは少なくなります。関数内には、パラメーターに基づいて生成される1つの動的クエリがあります(一部のパラメーターには別のテーブルの結合が含まれ、一部はwhere句の単なる追加条件です)

テーブル全体を何度も再検索する必要があるため、これはパフォーマンスを浪費すると言われました。

最初にすべてを検索すると、その結果からフィルタリングを開始するという考えがあります。それは良いかもしれません。

コードを改善するために何ができますか?通常のクエリで同じ結果を得る方法はありますか?

4

1 に答える 1

0

次のように、UNION を使用できる場合があります。

SELECT * FROM TABLE
  WHERE COL1='A'     AND COL2='B' AND COL3 = 'C' AND COL4 = 'D'
UNION ALL
SELECT * FROM TABLE
  WHERE COL1 IS NULL AND COL2='B' AND COL3 = 'C' AND COL4 = 'D'
UNION ALL
SELECT * FROM TABLE
  WHERE COL1 IS NULL AND COL2 IS NULL AND COL3 = 'C' AND COL4 = 'D'
UNION ALL
SELECT * FROM TABLE
  WHERE COL1 IS NULL AND COL2 IS NULL AND COL3 IS NULL AND COL4 = 'D'
UNION ALL
SELECT * FROM TABLE
  WHERE COL1 IS NULL AND COL2 IS NULL AND COL3 IS NULL AND COL4 IS NULL

共有してお楽しみください。

于 2012-08-31T12:42:01.867 に答える