SQL SELECT 语句根据 WHERE 语句跳过行
Posted
技术标签:
【中文标题】SQL SELECT 语句根据 WHERE 语句跳过行【英文标题】:SQL SELECT statement skips rows based on WHERE statement 【发布时间】:2016-01-05 16:10:02 【问题描述】:对不起,这可能是一个愚蠢的问题!我创建了一个程序来维护和运行一系列程序/功能。如果任何程序发生错误,则会向我发送一封电子邮件,并使用失败的程序名称设置自动刷新参数。单个表包含所有过程(确切名称为 varchar2)以自上而下的顺序运行,具有循环结构。如何跳到使用 select 语句失败的过程,同时抓住失败的过程下的所有其他过程?基本上我希望程序从它停止的地方开始,并继续运行所有其他程序的过程。我会很感激任何想法,因为我只是在学习。
更新
对于那些困惑的人。我需要一个 SELECT 语句,它根据位置跳过行并抓取第一行下方的所有其他行。下面的基本伪代码...
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
我需要抓取失败的程序以及下面的所有内容。
有什么想法吗?
提前谢谢你!
【问题讨论】:
请阅读常见问题解答,了解如何在 *** 上提出问题,以便获得最佳答案:***.com/help/how-to-ask。您应该有表格结构、示例数据和预期结果。 请提供代码,没有人喜欢阅读一些陈述,而且没有帮助,您的程序到底哪里有问题? @TomH 谢谢。下次我会记住这一点。不幸的是,我无法显示结构、示例数据或任何类似的东西。这正在我公司的测试服务器上进行测试,以准备在 pl/sql 和 Oracle 数据库中进行认证。我希望有人能给出一个我可以遵循的非常基本的例子,或者告诉我这是不可能的。 @pouyankhodabakhsh 这很公平。不幸的是,我不能根据合同提供。只需要知道这样的 SELECT 语句是否可行。 可悲的是,这就是我们的生活,互相挑剔死亡的答案。呃-我的意思是帮助别人并在这个过程中自己学习一些东西!祝大家新年快乐! :-) 【参考方案1】:我会咬人的,这到底是怎么回事。根据您上面的数据,假设只能有一行状态为“失败”,并假设程序按“id”顺序排列:
SELECT procedure
FROM table_whatever
WHERE id >= (SELECT ID
FROM table_whatever
where status = 'failed')
ORDER by id;
【讨论】:
是的,你所说的关于我制定的基本设计都是真实的。作为 SQL 和 PL/SQL 的初学者,我没有意识到您可以在 WHERE 子句中创建 SELECT。对于我的教程中的这个绕道来说,这似乎足够动态地工作。 使用min(ID)
将消除只有一个可以具有失败状态的要求。【参考方案2】:
根据您的最小伪代码,并假设“正确顺序”是按 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 的子查询方法也可以工作......
【讨论】:
以上是关于SQL SELECT 语句根据 WHERE 语句跳过行的主要内容,如果未能解决你的问题,请参考以下文章
SQL语句 select from where中可否嵌入if条件语句?