sql - 如果查询返回 0 行,则应用默认过滤器 - Oracle Plsql
问题描述
我正在使用 Oracle PLSQL。我试图在两个表之间建立一个连接,并从一个可以是“W”(女性)或“M”(男性)的参数中进行过滤。
我有一张包含工作列表的表格:
而另一个将每份工作翻译成英语或西班牙语的每个性别:
我想为参数中指定的性别将工作翻译成两种语言。如果没有女性的翻译,则获取男性的翻译。
我尝试使用 NVL 执行此操作,但它不起作用:
select j.*, l.long_name, l.language, l.gender
from job j
join job_lang l
on j.id = l.id_job
where j.short_name = 'Firefighter'
and nvl(l.gender, 'M') = 'M'; -- parameter
它在参数为“M”时完美运行,但在为“W”时不返回任何内容,因为没有针对 Woman 的翻译。
我不确定我是否可以用一个案例来做到这一点,我试过但我找不到任何东西。你可以帮帮我吗?
谢谢。
解决方案
您可以使用fetch
带有窗口函数的子句来确定优先级:
select j.*, l.long_name, l.language, l.gender,
from job j
join job_lang l on j.id = l.id_job
where j.short_name = 'Firefighter'
order by row_number() over(
partition by j.id, l.language
order by case when l.gender = 'M' then 0 else 1 end
) ^----- parameter
fetch first row with ties
推荐阅读
- java - 试图在一个小游戏JAVA中缩短这个if-else语句
- javascript - 如何解决具有两个值的承诺?
- android - 服务器(AndroidWebServer)无法从 PC 访问
- entity-framework-core - 如何在 Auto-mapper ProjectTo 中处理空值
- php - 我可以从另一个 cron 作业执行的 php 脚本修改 cron 作业的计划吗?
- angular - 如何向控制器发布值以接收数据以查看 Angular 5+?
- regex - 在字符串之后拉取值
- node.js - Node-Postgres:将事务语句合并为一个以提高速度?
- java - Scala:线程“main”中的异常 java.lang.NoClassDefFoundError: org/apache/log4j/LogManager
- c# - WPF 的行为类似于任务栏