Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL查询以在未找到翻译时获取默认值_Sql_Hsqldb - Fatal编程技术网

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