SQL SELECT语句根据WHERE语句跳过行

时间:2016-01-05 16:10:03

标签: sql plsql oracle11g oracle-sqldeveloper

我道歉,这可能是一个愚蠢的问题!我创建了一个维护并运行一系列过程/函数的过程。如果在任何过程中发生错误,则会向我发送电子邮件,并且会设置自动刷新参数,其中过程名称失败。单个表包含所有过程(名称为varchar2)以自上而下的顺序运行并具有循环结构。如何跳过使用select语句失败的过程以及获取失败的过程下的所有其他过程?基本上我希望程序从它停止的地方开始,并继续运行所有其他程序的过程。我会感激任何想法,因为我只是在学习。

更新

对于那些困惑的人。我需要一个SELECT语句,它根据where跳过行并抓取第一行下面的所有其他行。下面的基本伪代码......

SELECT procedure_name
FROM table_whatever
SKIP ROWS that procedure_status <> 'completed'
AND grab all rows underneath
WHILST keeping rows in proper order

id  procedure          status
15  table_insert       failed
16  table_update       In Queue
17  email_completion   In Queue

我需要抓住失败的程序以及下面的所有内容。

有什么想法吗?

提前谢谢!

2 个答案:

答案 0 :(得分:3)

我会咬,哎呀。根据您上面的数据,假设只有一行的状态为“失败”,并假设程序采用“id”顺序:

SELECT procedure
FROM   table_whatever
WHERE  id >= (SELECT ID
              FROM   table_whatever
              where  status = 'failed')
ORDER by id;

答案 1 :(得分:0)

根据您的最小伪代码,并假设“正确的顺序”是ID,您可以只排除那些已完成的:

SELECT procedure_name
FROM table_whatever
WHERE procedure_status <> 'completed'
ORDER BY id;

如果您明确要查找“失败” - 或者可以使用相同的查询在任何运行之前启动序列 - 您可以使用分析查询和内联视图,因此您只需要查看表一旦:

SELECT procedure_name
FROM (
  SELECT id, procedure_name, procedure_status,
    MIN(CASE WHEN procedure_status = 'failed' THEN id END) OVER () AS failed_id
  FROM table_whatever
)
WHERE id >= COALESCE(failed_id, 0)
ORDER BY id;

对于一个小桌子来说两次击中它可能不是什么大不了的事情,所以Gary_W的子查询方法也可以起作用......