我偶然发现了一段T代码,我正试图转换成Oracle。看起来是这样的:
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@局部变量是在过程前面的查询结果中设置的。
现在,我尝试以以下方式将其转换为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语句中使用@local变量。我知道这可能不是一个写得很好的查询,但是这里的解决方案是什么呢?我如何用合法的PL/SQL写这个呢?
发布于 2014-11-24 11:19:41
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-24 23:42:23
我不能假设表中只有一个记录,或者where子句包含其他筛选,以将结果集缩小到一个记录。以下建议重复了这样的行为:如果存在多行,且每个行的值字段可能不同,则结果将基于找到的最低值。
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查询编写得非常糟糕。当您只能在一个表中获得相同的结果时,为什么要对同一个表进行最多三个查询。它也可以更改为与PL/SQL几乎相同的查询。实际上,看起来语法是一样的。
https://stackoverflow.com/questions/27102637
复制相似问题