Return 基于所选的值
Return based on values selected
我真的不知道如何正确表达标题,如果标题令人困惑,请原谅。
这是我面临的情况:
我有一个 table...假设它包含以下行。
Name | Value
----- | ----
John | 1
Mary | 2
Jack | 3
Jim | 4
这是 PL/SQL 要求:
- 如果 John 存在,return John 和他的值。
- 如果约翰不存在,但玛丽存在,return玛丽和她的价值。
- 如果约翰和玛丽都不存在,return杰克或吉姆,以两者为准
具有较高的价值。
我能够使用游标遍历 table 并测试每一行,但我想知道是否还有其他更有效的方法。
谢谢!
不需要游标和循环。您可以在单个查询中执行此操作,使用条件排序和 fetch
子句:
select *
from mytable
order by
case name when 'John' then 1 when 'Mary' then 2 else 3 end,
value desc
fetch first row only
或者如果您是 12c 之前的 Oracle 版本,其中 fetch
子句不可用:
select name, value
from (
select t.*,
row_number() over(order by
case name when 'John' then 1 when 'Mary' then 2 else 3 end,
value desc
) rn
from mytable t
) t
where rn = 1
我真的不知道如何正确表达标题,如果标题令人困惑,请原谅。
这是我面临的情况: 我有一个 table...假设它包含以下行。
Name | Value
----- | ----
John | 1
Mary | 2
Jack | 3
Jim | 4
这是 PL/SQL 要求:
- 如果 John 存在,return John 和他的值。
- 如果约翰不存在,但玛丽存在,return玛丽和她的价值。
- 如果约翰和玛丽都不存在,return杰克或吉姆,以两者为准 具有较高的价值。
我能够使用游标遍历 table 并测试每一行,但我想知道是否还有其他更有效的方法。
谢谢!
不需要游标和循环。您可以在单个查询中执行此操作,使用条件排序和 fetch
子句:
select *
from mytable
order by
case name when 'John' then 1 when 'Mary' then 2 else 3 end,
value desc
fetch first row only
或者如果您是 12c 之前的 Oracle 版本,其中 fetch
子句不可用:
select name, value
from (
select t.*,
row_number() over(order by
case name when 'John' then 1 when 'Mary' then 2 else 3 end,
value desc
) rn
from mytable t
) t
where rn = 1