Oracle解码函数检查行是否返回?

时间:2013-06-04 00:57:08

标签: sql oracle cursor

我正在cursor语句中查看decode(1, 1, 1, NULL, 0) SELECT CURSOR worked_more_then_five_years IS SELECT decode(1, 1, 1, NULL, 0) FROM table WHERE /*query conditions*/ 。该查询返回已工作5年或更长时间的员工的记录。我假设解码语句的目的是检查是否返回记录(意味着该员工已经工作了五年或更长时间)。

这种方法似乎不起作用。可能是因为我只是输入错误的虚拟数据。我的假设是否正确(这种方法不起作用)?如果我不正确,这个解码语句如何实现识别是否返回记录的目标?

{{1}}

4 个答案:

答案 0 :(得分:1)

decode语句正在影响返回的行的返回值。

为了保证返回行 ,最好使用聚合:

CURSOR worked_more_then_five_years
IS
SELECT (case when count(*) > 0 then 1 else 0 end)
FROM table
WHERE /*query conditions*/

case语句是与decode()“等效”的SQL标准。聚合将始终返回一行。如果没有匹配项,则值为0;如果匹配,则满足第一个子句,返回值为1.

答案 1 :(得分:1)

保证返回单行,并指示是否符合条件:

select count(*) row_found
from   table
where  ...
  and  rownum <= 1;

只要没有其他(非聚合)列,您将始终返回一行。

如果你的谓词保证只有一行符合条件,那么当然你可以关闭rownum谓词,实际上只要使用聚合就可以返回值:

select count(*) row_found,
       min(employee_id) employee_id,
       min(date_started) date_started
       ...
from   table
where  predicate_to_return_one_row.

答案 2 :(得分:0)

CURSOR working_more_then_five_years IS SELECT解码(1,1,1,NULL,0) 从表 WHERE / 查询条件 /

Decode的第一个参数必须是Column Name。 例) SELECT DECODE(WORK_YEAR,'5',WORK_YEAR,NULL) FROM TABLE

那句话的意思是“如果WORK_YEAR是'5',那么它应该输出'5',如果WORK_YEAR不是'5',那么所有的输出都是'null'。”

答案 3 :(得分:-1)

解码语句的工作方式类似于“if-then-else”,因此如果我们不提供任何默认情况,则返回null。它基本上有助于在检索期间操纵数据。

在你的陈述中你在比较什么?