Oracle SQL:所有行大于值(如果值存在)或所有行小于值(如果值不存在)

Posted

技术标签:

【中文标题】Oracle SQL:所有行大于值(如果值存在)或所有行小于值(如果值不存在)【英文标题】:Oracle SQL: All rows greater than value (if value is present) OR all rows less than value (if value is not present) 【发布时间】:2018-01-28 01:57:21 【问题描述】:

我有一个查询,它以以下格式返回数据:

ID      VALUE       INDEX
ID1     VALUE1      0
ID1     VALUE2      1
ID1     VALUE3      2
ID1     VALUE4      2
ID1     VALUE5      3
ID2     VALUE1      0
ID2     VALUE2      2
ID2     VALUE3      3
ID2     VALUE4      3
ID3     VALUE1      0
ID3     VALUE2      1
ID3     VALUE3      1
ID4     VALUE1      1
ID4     VALUE2      2

我需要查找特定 ID 的 INDEX 列大于或等于 2 的行。如果特定 ID 不存在此类行,则只有我的查询应返回该 ID 的所有行,其 INDEX 列小于大于 2。

例如在上述数据场景中,我的查询应返回如下行:

ID      VALUE       INDEX
ID1     VALUE3      2
ID1     VALUE4      2
ID1     VALUE5      3
ID2     VALUE2      2
ID2     VALUE3      3
ID2     VALUE4      3
ID3     VALUE1      0
ID3     VALUE2      1
ID3     VALUE3      1
ID4     VALUE2      2

我可以实现的一种方法是执行两次相同的查询。第一个查询将返回 INDEX 大于或等于 2 的所有行。在第二个查询中,我将尝试再次查找在第一个查询中找到的 ID 中不存在 ID 的所有行。

我不想两次执行相同的查询。我想知道是否可以使用单个查询来完成工作。如果您对如何在单个查询中执行此操作有任何想法,请告诉我。

谢谢,

【问题讨论】:

【参考方案1】:

我认为窗口函数让这变得非常简单:

select t.*
from (select t.*, max(index) over (partition by id) as max_index
      from t
     ) t
where max_index < 2 or
      index >= 2;

【讨论】:

感谢 Gordon 的快速反馈。根据初步测试,它似乎正在工作。我会在整个表上执行这个查询,并尽早分享反馈,

以上是关于Oracle SQL:所有行大于值(如果值存在)或所有行小于值(如果值不存在)的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server的空值处理策略

Oracle:PL/SQL 中查看值是不是存在的最快方法:列表、VARRAY 或临时表

oracle查询日期字段大于某个日期值时sql语句怎么写

如果记录存在,Oracle 存储过程会更新行

php如何判断一个字段是不是存在

oracle sql判断一个数大于2000 如果大于减1500