首页 > 解决方案 > 如果查询返回 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 的翻译。

在此处输入图像描述

我不确定我是否可以用一个案例来做到这一点,我试过但我找不到任何东西。你可以帮帮我吗?

谢谢。

标签: sqloraclenullnvl

解决方案


您可以使用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

推荐阅读