2

DB2v9を使用しています

空の文字列として渡される可能性のあるパラメータを含むストアドプロシージャがあります。ここに私がやろうとしていることのいくつかの擬似コードがあります:

WHERE myColumn.name =
     IF param1 = '' THEN
        **disregard this param, all column values are eligible**
     ELSE
        myColumn.name = param1;

基本的に、空の文字列の場合はparamを無視します。そうでない場合は、WHERE句のフィルターとして適用します。これはDB2で行うことができますか?

4

3 に答える 3

5
SELECT ...
FROM ...
WHERE  param1 = '' 
   OR  myColumn.name = param1
   ;
于 2012-04-18T17:08:10.953 に答える
1

wildplasserによって提供された答え正しいですが、含めるのに役立つ可能性のある追加の考慮事項がいくつかあります。

まず、ストアドプロシージャの入力パラメータに''ではなくNULLが含まれている可能性があります。COALESCEまたはNULLIF関数を使用すると、NULLと任意の量の空のスペースの両方がカバーされます。

SELECT ... FROM ... WHERE COALESCE( param1, '' ) = '' OR myColumn.name = param1 ;

このタイプの検索クエリがストアドプロシージャにコンパイルされると、通常、プロシージャ内のステートメントでREOPTALWAYSを有効にするのに役立ちます。これを行わないと、実行時にストアドプロシージャに渡される入力パラメータに関係なく、ストアドプロシージャ内のSQLステートメントは常に同じアクセスプランを使用します。オプティマイザーが実行時にプロシージャー内の各ステートメントを再評価できるようにすると、ユーザーが特定の列を検索するときに適切な索引を利用する可能性がはるかに高くなります。

CALL SYSPROC.REBIND_ROUTINE_PACKAGE 
    ('P','YOURPROCSCHEMA.YOURPROCNAME','REOPT ALWAYS') ; 
于 2012-04-18T22:28:41.653 に答える
0

ここでのもう1つのキーワードは、「動的SQL」です。クエリを文字列として作成し、EXECUTE IMMEDIATEそれら(UPDATE、INSERT、またはDDLの場合)または//(SELECTの場合)を使用しPREPAREます。OPENFETCH

于 2012-04-20T21:10:04.820 に答える