如果找不到翻译,则使用SQL查询获取默认值

时间:2015-08-28 04:10:07

标签: sql hsqldb

这些是我的表格:

Product:
ID PRICE NAME    DESCRIPTION
1  100   laptop  laptop_desc
2  200   mouse   mouse_desc

Product_Translations:
PID  LANG NAME DESCRIPTION
1    ch   伊吾  伊吾伊吾

请不要担心产品表中的名称和说明。如果用户选择了默认语言,我们会保留它以避免加入。

现在我需要编写一个查询来根据用户的语言获取产品中的所有产品,如果在 Product_Translations中找不到名称和描述的翻译,则使用后备产品表中获取它们。我尝试了几种不同的方式,但无法使其发挥作用。 更新:

我需要Product表中的所有列(在这个例子中,我只给了2,但我的实际表有更多的列)。还有一个限制是我需要使用JPA Criteria API生成此查询,因此JPA不支持的任何SQL关键字可能对我不起作用。

感谢您的帮助。

3 个答案:

答案 0 :(得分:0)

使用LEFT OUTER JOIN:

SELECT 
      p.id
     ,p.price
     ,ISNULL(t.name, p.name) AS translation
     ,ISNULL(t.description, p.description) AS description
FROM Product p
LEFT JOIN Translations t
   ON p.id = t.pid
   AND t.lang = ?

如果您使用其他数据库更改为COALESCE()。

,这将适用于SQL Server

答案 1 :(得分:0)

SELECT p.ID, p.Price,
      COALESCE(pt.Name, p.Name) Name, 
      COALESCE(pt.Description, p.Description) Description
FROM Product p
INNER JOIN User u on u.ID = @MyUserID
LEFT JOIN Product_Translations pt ON pt.PID = p.ID AND pt.LANG = u.LANG

答案 2 :(得分:0)

在您的情况下,您应该使用LEFT JOIN

SELECT p.ID, p.PRICE, ISNULL(pt.NAME,p.NAME) AS NAME, p.DESCRIPTION 
FROM Product AS p 
    LEFT JOIN Product_Translations AS pt ON p.ID = pt.PID
WHERE pt.LANG = @UserLang

hsqldb中的ISNULL http://hsqldb.org/doc/guide/builtinfunctions-chapt.html#bfc_general_functions