web-dev-qa-db-fra.com

où placer la colonne CASE WHEN IS NULL dans cette requête

J'ai des difficultés à traduire une requête MS Access en SQL:

SELECT id, col1, col2, col3
FROM table1

LEFT OUTER JOIN table2
ON table1.id = table2.id

LEFT OUTER JOIN table3
ON table1.id = table3.id

jusqu'ici tout va bien, mais voici la partie (CASE) où je reste bloqué:

CASE WHEN table3.col3 IS NULL THEN table2.col3 AS col4 ELSE table3.col3 as col4

Je sais que la ligne ci-dessus ne fonctionne pas, mais j'espère que cela indique ce que j'essaie d'accomplir. Merci!

MISE À JOUR: Toutes les suggestions jusqu’à présent ont abouti à l’erreur "Syntaxe incorrecte près du mot clé" ", alors peut-être qu’il me manque quelque chose. Ci-dessous la requête réelle. Le problème est que nous avons deux tableaux, à la fois avec et la colonne EUID. Si dbo.EU_Admin3.EUID n'est pas NULL, il est prioritaire dans la jointure. Si dbo.EU_Admin3.EUID est NULL, utilisez dbo.EU_Admin2.EUID à la place. Espérons que cela clarifie cela.

SELECT dbo.AdminID.CountryID, dbo.AdminID.CountryName, dbo.AdminID.RegionID, 
dbo.AdminID.[Region name], dbo.AdminID.DistrictID, dbo.AdminID.DistrictName,
dbo.AdminID.ADMIN3_ID, dbo.AdminID.ADMIN3 
(CASE WHEN dbo.EU_Admin3.EUID IS NULL THEN dbo.EU_Admin2.EUID ELSE dbo.EU_Admin3.EUID END AS EUID)
FROM dbo.AdminID 

LEFT OUTER JOIN dbo.EU_Admin2
ON dbo.AdminID.DistrictID = dbo.EU_Admin2.DistrictID

LEFT OUTER JOIN dbo.EU_Admin3
ON dbo.AdminID.ADMIN3_ID = dbo.EU_Admin3.ADMIN3_ID
7
ivorytux

Essaye ça:

CASE WHEN table3.col3 IS NULL THEN table2.col3 ELSE table3.col3 END as col4

Le as col4 devrait aller à la fin de la déclaration CASE. Notez également que vous manquez la END aussi.

Une autre option probablement plus simple serait:

IIf([table3.col3] Is Null,[table2.col3],[table3.col3])

Juste pour clarifier, MS Access ne prend pas en charge COALESCE. Si c'était le cas, ce serait la meilleure façon de faire.

Modifier après un changement radical de question:

Pour transformer la requête en SQL Server, vous pouvez utiliser COALESCE (la réponse technique a donc été apportée auparavant):

SELECT dbo.AdminID.CountryID, dbo.AdminID.CountryName, dbo.AdminID.RegionID, 
dbo.AdminID.[Region name], dbo.AdminID.DistrictID, dbo.AdminID.DistrictName,
dbo.AdminID.ADMIN3_ID, dbo.AdminID.ADMIN3,
COALESCE(dbo.EU_Admin3.EUID, dbo.EU_Admin2.EUID)
FROM dbo.AdminID

En passant, votre instruction CASE manquait d'un , avant le champ. C'est pourquoi cela n'a pas fonctionné.

16
Mosty Mostacho

Cela ressemble à cela pourrait appartenir à l'instruction select:

SELECT id, col1, col2, col3, (CASE WHEN table3.col3 IS NULL THEN table2.col3 AS col4 ELSE table3.col3 as col4 END)
FROM table1
LEFT OUTER JOIN table2
ON table1.id = table2.id
LEFT OUTER JOIN table3
ON table1.id = table3.id
1
s.ts

Merci pour votre aide! @Svetoslav Tsolov était très proche, mais je continuais à avoir une erreur, jusqu'à ce que je découvre que la parenthèse finale était au mauvais endroit. Voici la dernière requête qui fonctionne:

SELECT dbo.AdminID.CountryID, dbo.AdminID.CountryName, dbo.AdminID.RegionID, 
dbo.AdminID.[Region name], dbo.AdminID.DistrictID, dbo.AdminID.DistrictName,
dbo.AdminID.ADMIN3_ID, dbo.AdminID.ADMIN3,
(CASE WHEN dbo.EU_Admin3.EUID IS NULL THEN dbo.EU_Admin2.EUID ELSE dbo.EU_Admin3.EUID END) AS EUID
FROM dbo.AdminID 

LEFT OUTER JOIN dbo.EU_Admin2
ON dbo.AdminID.DistrictID = dbo.EU_Admin2.DistrictID

LEFT OUTER JOIN dbo.EU_Admin3
ON dbo.AdminID.ADMIN3_ID = dbo.EU_Admin3.ADMIN3_ID
1
ivorytux

Incapable de comprendre votre problème, mais votre énoncé de cas est incorrect 

CASE 
WHEN 
TABLE3.COL3 IS NULL
THEN TABLE2.COL3
ELSE
TABLE3.COL3
END 
AS
COL4
0
Youbaraj Sharma