2

IN パラメータに応じて WHERE 句を作成しようとしています。このため、WHERE IN 句内で CASE を使用する実験を行っています。うまく機能するのは次のとおりです。

SELECT * FROM TABLE1 WHERE COL1 IN (SELECT ID FROM TABLE2);

P1 という名前の入力パラメータがあるとします。タイプは不要です。P1 の値が null の場合、次の値も正常に機能します。

SELECT * FROM TABLE1 WHERE COL1 IN (CASE P1 WHEN NULL THEN COL1 ELSE (SELECT ID FROM TABLE2));

しかし、P1がNULLでない場合、私は得る

ORA-01427: 単一行の副問合せが複数の行を返します

エラー。

なぜこれが必要なのか疑問に思われる場合は、簡単に説明させてください。ストアド プロシージャは、多くの入力パラメーターを受け入れます。それらのいくつかは、ユーザー定義のコレクション型になります。また、すべてのパラメーターは省略可能で、DEFAULT NULL 値が指定されます。したがって、パラメーターが NULL かどうかを確認したい場合は、パラメーターに対応する列をそれ自体と比較します (つまり、その列にフィルターがないことを意味します)。それ以外の場合は、パラメーター内の値で列をフィルター処理します。私が試みていた方法は何とか可能ですか?

4

2 に答える 2

3

あなたには、複数の行を返す がELSE含まれています。SELECT

代わりに、IN をテストする前に NULL をテストできます。

SELECT * FROM TABLE1 WHERE (P1 IS NULL) OR (COL1 IN (SELECT ID FROM TABLE2));
于 2013-02-20T13:31:02.930 に答える
2

COL1 IN (COL1)は と同じなのでtrue、クエリを次のように書き換えることができます。

SELECT *
FROM TABLE1
WHERE P1 IS NULL OR COL1 IN (SELECT ID FROM TABLE2);

一般に、句は;CASE/WHEN/ENDの「射影」部分でのみ使用できます。句SELECTで「通常の」ブール式を使用する必要があります。WHERE

于 2013-02-20T13:33:18.443 に答える