SQL查询以在未找到翻译时获取默认值
这些是我的桌子:SQL查询以在未找到翻译时获取默认值,sql,hsqldb,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获取所有产品,如果
Product:
ID PRICE NAME DESCRIPTION
1 100 laptop laptop_desc
2 200 mouse mouse_desc
Product_Translations:
PID LANG NAME DESCRIPTION
1 ch 伊吾 伊吾伊吾
请不要担心产品表中的名称和说明。如果用户选择了默认语言,我们将保留它以避免加入
现在我需要编写一个查询,根据用户的语言从Product获取所有产品,如果在Product\u translations中找不到名称和描述的翻译,则从Product表中获取它们。我尝试了两种不同的方法,但都没有成功。
更新:
我需要Product表中的所有列(在本例中,我只给出了2列,但我的实际表有更多列)。还有一个限制是,我需要使用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 Server上起作用。在您的情况下,应该使用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
LEFT JOIN
是你的朋友。使用LEFT JOIN后,COALESCE()
是你的下一个朋友。等等…\u你在用什么?MySQL、SQL Server、PlSQL?@TimBiegeleisen hsqldCoalesce()也适用于SQL Server,那么为什么还要使用其他任何东西呢?COALESCE是语法糖,在某些情况下是不确定的+它根据所有表达式(而不是第一个表达式)的类型优先级计算其类型。它的唯一功能是它是ANSI标准的一部分,支持多个输入。您的查询没有给出默认值,我认为最后一行应该是“and t.lang=?”。还有一件事是我需要Product表中的所有列。@geekprogrammer对于Product表中的所有列只需添加p.*,但我更愿意显式指定它们,因为SELECT中的*是一种错误的做法。如果我添加p.*,它会重复名称和描述。简言之,我需要的名称和描述只来一次,包括其余的列。有什么办法吗?谢谢和COALECSE应该合并。如果我不想单独提及诸如p.Id和p.Price之类的列名,我该怎么做p.*。选择p.*,COALESCE(pt.name,p.name)name,COALESCE(pt.description,p.description)description从产品p左连接产品pt ON pt.PID=p.ID,pt.LANG='ch'给出名称和描述两次。SELECT*
非常不受欢迎。可能,但在我的情况下,我需要选择所有列。在这个例子中,为了简单起见,我只给出了id和price。我的实际表有更多的列。您仍然可以选择p.*
,然后为这两列指定不同的名称,并仅显示这些名称。。。。但是需要所有的列是不相关的。如果您需要所有列,请按名称要求所有列<代码>选择*是坏的jujuju。
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