0

Oracle に変換しようとしていた T-SQL の一部に出会いました。次のようになります。

SET @local variable= 
    CASE 
        when exists (select field from table where value=0) then 0
        when exists (select same field from same table where value=1) then 1
        when exists (select same fieldfrom same table where value=2) then 1
        else @local variable
    END

@local 変数は、手順の前半でクエリの結果に設定されています。

ここで、これを次の方法で Oracle に変換しようとしました。

BEGIN
    SELECT CASE
        WHEN EXISTS (
            SELECT field
            FROM table
            WHERE value = 0
        )
        THEN 0
        WHEN EXISTS (
            SELECT same field
            FROM same table
            WHERE value = 1
        )
        THEN 1
        WHEN EXISTS (
            SELECT same field
            FROM same table
            WHERE value = 2
        )
        THEN 1
        ELSE localvariable
    END 
    INTO localvariable
    FROM DUAL;
END;

ただし、PL/SQL は、else ステートメントとinto ステートメントで @localvariable を使用することを好まないようです。これはそもそも適切に記述されたクエリではない可能性があることは承知していますが、ここでの解決策は何ですか? これを合法的なPL/SQLで書くにはどうすればよいですか?

4

3 に答える 3

1

CASEandは、期待どおりには使用EXISTS できません

このようなことができます。

DECLARE
    localvariable1 NUMBER;
    localvariable2 NUMBER;
    localvariable3 NUMBER;
    localvariable  NUMBER;
BEGIN

    SELECT COUNT(DECODE(value,'0',field)) as v1,
           COUNT(DECODE(value,'1',field)) as v2,
           COUNT(DECODE(value,'2',field)) as v3 
    INTO
           localvariable1,
           localvariable2,
           localvariable3
    FROM table;

    IF(localvariable1 > 0)
    THEN
        localvariable := 0;
    ELSIF(localvariable2 > 0 OR localvariable3 > 0 )
    THEN
        localvariable := 1;
    END;
END;
于 2014-11-24T11:19:41.907 に答える
1

テーブルにレコードが 1 つしかないことやwhere、結果セットを 1 つのレコードに絞り込むための他のフィルタリングが句に含まれていることは想定できません。次の提案は、複数の行があり、それぞれの [値] フィールドが異なる可能性がある場合、結果は見つかった最小値に基づくという動作を複製します。

declare LocalVar number;
...
select case Min( Value )
         when 0 then 0
         when 1 then 1
         when 2 then 1
         else LocalVar end 
into LocalVar
from SomeTable
where Value between 0 and 2
  and possible_other_criteria;

実際、T-SQL クエリはひどく書かれています。1 つのクエリだけで同じ結果が得られるのに、同じテーブルに対して最大 3 つのクエリを作成する必要はありません。PL/SQL とほぼ同じクエリに変更することもできます。実際、構文は同じように見えます。

于 2014-11-24T23:42:23.887 に答える