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

不能CASE以您期望的方式使用。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

我不能假设表中只有一条记录,或者该where子句包含其他过滤以将结果集缩小到一条记录。以下建议重复了如果存在多行且每行的 Value 字段可能不同的行为,则结果将基于找到的最低值。

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 查询写得很糟糕。当您只能在一个表中获得相同的结果时,为什么还要对同一个表进行三个查询。它也可以更改为与 PL/SQL 几乎相同的查询。事实上,看起来语法是一样的。

于 2014-11-24T23:42:23.887 回答
0

正确的方法是使用临时变量来分配(在 Oracle 11.2g 上测试):

    宣布
     tmp pls_integer;
    开始
        选择案例
            当存在时(
                选择 1
                FROM any_table1
                WHERE 值 = 0
            )
            那么 0
            当存在时(
                选择 1
                FROM any_table2
                WHERE 值 = 1
            )
            那么 1
            当存在时(
                选择 1
                来自 any_table3
                WHERE 值 = 2
            )
            那么 1
            ELSE:局部变量
        结尾
        进入tmp
        从双;
    :局部变量:= tmp;
    结尾;
    /
    

于 2015-04-10T14:16:19.087 回答