Db2 Select语句返回一个值,如果第一个值为null,则返回另一个值

Db2 Select语句返回一个值,如果第一个值为null,则返回另一个值,db2,Db2,我有一个书桌,如下所示: id locale name book_id ... 1 "en-GB" The book 421 2 "fr-FR" Le livre 421 ... 我需要为给定的区域设置选择书籍的名称(例如“fr fr”),但是,如果没有设置第一个名称,则使用默认的区域设置(“en-GB”)检索名称,该区域设置将始终设置。 我怎么能这么做? 我正在使用DB2。 我试过以下说法: SELECT

我有一个书桌,如下所示:

id     locale     name         book_id     ...
1      "en-GB"    The book     421
2      "fr-FR"    Le livre     421
...
我需要为给定的区域设置选择书籍的名称(例如“fr fr”),但是,如果没有设置第一个名称,则使用默认的区域设置(“en-GB”)检索名称,该区域设置将始终设置。 我怎么能这么做? 我正在使用DB2。 我试过以下说法:

SELECT CASE WHEN B.NAME IS NOT NULL THEN B.NAME ELSE A.NAME END AS NAME FROM BOOK A JOIN BOOK B ON B.BOOK_ID = A.BOOK_ID WHERE A.LOCALE =  "en-GB" AND B.LOCALE = "fr-FR"
但是,这仅在两个区域设置都已定义时有效,而在我需要的情况下(未设置第二个区域设置时)无效

提前谢谢

用我自己的答案编辑: 我最终通过一个联盟实现了这一目标:

SELECT NAME FROM BOOK WHERE BOOK_ID = 421 AND LOCALE = "en-GB"
UNION ALL
SELECT NAME FROM BOOK WHERE BOOK_ID = 421 AND LOCALE = "fr-FR"
FETCH  FIRST 1 ROW ONLY

我在前面的回答中说视图,我指的是存储过程。 您可能想看看如何创建存储过程。在SP中,可以添加if-else语句

CREATE PROCEDURE SomeProcedure
AS
BEGIN
    IF Exists(SELECT 1 FROM Book WHERE locale = "en-GB")
        SELECT * FROM Book WHERE locale = "fr-FR"
    ELSE
        SELECT * FROM Book WHERE locale = "en-GB"
END
类似这样的东西。

试试这个:

select *
from mytable
where book_id=421 and locale in 
--('*', 'en-GB')
('fr-FR', 'en-GB')
order by case when locale='en-GB' then 1 else 0 end
fetch first 1 row only;

不同的身份证?那么你怎么能找到不同语言的同一本书呢?对不起,我只是复制了表的一部分,有一个bookId字段用于查找同一本书。非常感谢您的回答,我已经编辑了这个问题。请看一下窗口功能@FVod如果不使用排序,那么使用union all的select语句的结果可能不稳定……没错,需要ORDER BY。非常感谢您使用case表达式不需要视图。在这里如何使用case表达式?因为案例取决于两个不同的“where”结果,即LOCALE=“fr fr”和LOCALE=“en GB”