Supposons que j'ai des tables a (avec la colonne a1) et b (avec les colonnes b1 et b2) et que j'effectue une jointure externe gauche
SELECT *
FROM a LEFT OUTER JOIN b
ON a.a1 = b.b1
Alors b1 et b2 seront NULL où une valeur de a1 n'a pas de valeur correspondante de b1.
Puis-je fournir une valeur par défaut pour b2, au lieu de NULL? Notez que COALESCE ne fonctionnera pas ici, car je ne veux pas que la valeur par défaut remplace les NULL potentiels dans b2 où il y a une valeur de b1 correspondant à a1.
Autrement dit, avec a et b comme
CREATE TABLE a (a1)
AS VALUES (1),
(2),
(3) ;
CREATE TABLE b (b1,b2)
AS VALUES (1, 10),
(3, null) ;
a1 b1 | b2
--- --------
1 1 | 10
2 3 | NULL
3
et une valeur par défaut pour b2 de, disons 100, je veux obtenir le résultat
a1 | b1 | b2
---------------
1 | 1 | 10
2 | NULL | 100
3 | 3 | NULL
Dans ce cas simple, je pourrais le faire "à la main" en regardant si b1 est NULL dans la sortie. Est-ce la meilleure option en général, ou existe-t-il une manière plus standard et plus soignée?
la source
sql
(ce qui signifie "SQL le langage de requête". Cette balise ne désigne aucun produit SGBD ou dialecte spécifique). La partie:[b2]=CASE WHEN ... END
est une expression SQL non valide (standard).La réponse originale à cette question est restée inexpliquée, nous allons donc donner un autre coup.
Utiliser une
CASE
déclarationEn utilisant cette méthode, nous exploitons que nous avons une autre valeur dans une autre colonne que
IS NOT NULL
dans ce cas,b.b1
si cette valeur est nulle, nous savons que la jointure a échoué.Cela fonctionnera totalement et générera exactement ce que vous voulez.
Utilisation d'un sous-SELECT
N'utilisez pas cette méthode, c'est une idée d'accumulation. Continue de lire.
Si nous n'avons pas de
NOT NULL
colonnes que nous pouvons exploiter comme ça, nous avons besoin de quelque chose pour créer une colonne qui puisse fonctionner de cette façon pour nous ...Utilisation d'une comparaison de lignes
Il est encore plus facile de forcer une valeur fausse pour laquelle nous pouvons comparer, c'est de comparer la ligne. Dans PostgreSQL, la ligne a une valeur par le nom de la table. Par exemple,
SELECT foo FROM foo
retourne une ligne de typefoo
(qui est un type de ligne), à partir de la tablefoo
. Ici, nous testons pour voir si cette ROW est nulle. Cela fonctionnera tant que chaque colonneIS NOT NULL
. Et, si chaque colonneIS NULL
de votre table, alors vous êtes juste à la traîne.la source
b1
utilisée dans laCASE
solution n'a pas besoin d'être non nulle. La construction fonctionne dans les deux cas.Je trouve COALESCE très utile dans ce cas. Il renverra la première valeur non NULL d'une liste:
la source