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”