SQL 如果未找到翻译,则查询获取默认值
SQL query to get default values if translations are not found
这些是我的 table:
Product:
ID PRICE NAME DESCRIPTION
1 100 laptop laptop_desc
2 200 mouse mouse_desc
Product_Translations:
PID LANG NAME DESCRIPTION
1 ch 伊吾 伊吾伊吾
请不要担心产品中的名称和描述 table。如果用户选择了默认语言,我们将保留它以避免加入。
现在我需要编写一个查询,根据用户的语言从 Product 中获取所有产品,如果在 [=22] 中找不到名称和描述的翻译,则回退=]Product_Translations 从 Product table 获取它们。我尝试了几种不同的方法,但无法使其正常工作。
更新:
我需要产品 table 的所有列(在这个例子中,我只给了 2,但我的实际 table 有更多列)。还有一个限制是我需要使用 JPA Criteria API 生成此查询,因此 JPA 不支持的任何 SQL 关键字可能对我不起作用。
感谢您的帮助。
使用左外连接:
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 服务器。
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
在你的情况下,你应该使用 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
这些是我的 table:
Product:
ID PRICE NAME DESCRIPTION
1 100 laptop laptop_desc
2 200 mouse mouse_desc
Product_Translations:
PID LANG NAME DESCRIPTION
1 ch 伊吾 伊吾伊吾
请不要担心产品中的名称和描述 table。如果用户选择了默认语言,我们将保留它以避免加入。
现在我需要编写一个查询,根据用户的语言从 Product 中获取所有产品,如果在 [=22] 中找不到名称和描述的翻译,则回退=]Product_Translations 从 Product table 获取它们。我尝试了几种不同的方法,但无法使其正常工作。 更新:
我需要产品 table 的所有列(在这个例子中,我只给了 2,但我的实际 table 有更多列)。还有一个限制是我需要使用 JPA Criteria API 生成此查询,因此 JPA 不支持的任何 SQL 关键字可能对我不起作用。
感谢您的帮助。
使用左外连接:
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 服务器。
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
在你的情况下,你应该使用 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