Select语句返回一个值;如果第一个为空,则返回另一个值

时间:2019-09-04 07:14:43

标签: db2

我的书本表如下:

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"

但是,这仅在定义了两个语言环境时才有效,但在我需要的情况下(未设置第二个语言环境时)无效。

谢谢。

使用我自己的答案进行编辑: 我终于使用UNION实现了这一点:

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

2 个答案:

答案 0 :(得分:1)

尝试一下:

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;

答案 1 :(得分:0)

我在上一个回答中说View是指存储过程。 您可能需要看一下创建存储过程。在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

这样的事情。