/ / SQL query pour obtenir les valeurs par défaut si les traductions ne sont pas trouvées - sql, hsqldb

Requête SQL pour obtenir les valeurs par défaut si les traductions ne sont pas trouvées - sql, hsqldb

Ce sont mes tables:

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

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

Veuillez ne pas vous soucier du nom et de la description dans la table des produits. Nous le conservons pour éviter la jointure si la langue par défaut est sélectionnée par l'utilisateur.

Maintenant, je dois écrire une requête pour obtenir tous les produits de Produit selon la langue des utilisateurs avec repli que si aucune traduction pour le nom et la description ne se trouve dans Product_Translations les faire sortir de Produit table. J'ai essayé plusieurs manières différentes, mais je ne pouvais pas le faire fonctionner. Mettre à jour:


J'ai besoin de toutes les colonnes de la table produit (InDans cet exemple, je n’ai donné que 2, mais ma table actuelle contient plus de colonnes). Et une autre restriction est que je dois générer cette requête à l'aide de l'API Critères JPA. Par conséquent, les mots clés SQL non pris en charge par JPA peuvent ne pas fonctionner pour moi.

Merci de votre aide.

Réponses:

0 pour la réponse № 1
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

0 pour la réponse № 2

Dans votre cas, vous devriez utiliser 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

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


0 pour la réponse № 3

Utilisez 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 = ?

Cela fonctionnera sur SQL Server si vous utilisez une autre modification de base de données pour COALESCE ().