Postgres tableau de recherche dans la clause where
J'ai une requête:
SELECT bar, (SELECT name FROM names WHERE value = bar) as name
FROM foobar WHERE foo = 1 and bar = ANY (1,2,3)
Mon problème c'est que quand il n'y a pas de ligne contenant bar = 3
(ou toute autre valeur est demandé) dans le tableau foobar
, aucune ligne n'est retournée pour que la valeur de la barre.
J'aimerais que ma requête pour renvoyer une ligne de [bar, NULL]
à la place, mais ne peux pas penser à une façon d'aborder cette.
Est-ce même possible?
Deux choses devraient se préciser votre requête:
Je pense que le tableau est un hareng rouge ici. Je crois qu'il veut une ligne de (bar, NULL) retourné, ce qui fait sens dans son contexte.
Peter, le tableau est tout simplement une façon de s'adapter à plusieurs valeurs de la barre sans avoir à générer beaucoup de "bar = x ou bar = y ou..." clauses. Je n'ai aucun contrôle dessus de la barre des valeurs, c'est mon entrée et il peut contenir une ou plusieurs valeurs que j'ai à interroger. D'où le tableau. Si il n'y a plus épurée de manière à ce faire avec SQL, j'aimerais vous entendre à ce sujet.
Je pense que votre question et ma réponse serait un meilleur ajustement sur dba.se - si vous l'acceptez, êtes-vous prêt à envisager d'auto-repérage de la migration?
left outer join
permettra de joindre à votre demande. Deuxièmement, les tableaux ne sont pas vraiment faites pour être fouillé comme les mini-tables. Si vous ne connaissez pas l'index du tableau il y a une bonne chance que vous êtes en abuser.Je pense que le tableau est un hareng rouge ici. Je crois qu'il veut une ligne de (bar, NULL) retourné, ce qui fait sens dans son contexte.
Peter, le tableau est tout simplement une façon de s'adapter à plusieurs valeurs de la barre sans avoir à générer beaucoup de "bar = x ou bar = y ou..." clauses. Je n'ai aucun contrôle dessus de la barre des valeurs, c'est mon entrée et il peut contenir une ou plusieurs valeurs que j'ai à interroger. D'où le tableau. Si il n'y a plus épurée de manière à ce faire avec SQL, j'aimerais vous entendre à ce sujet.
Je pense que votre question et ma réponse serait un meilleur ajustement sur dba.se - si vous l'acceptez, êtes-vous prêt à envisager d'auto-repérage de la migration?
OriginalL'auteur Alex Tokarev | 2011-03-30
Vous devez vous connecter pour publier un commentaire.
Peut-être quelque chose comme cette approche est ce que vous êtes après:
banc d'essai:
méthode originale:
méthode alternative:
Si vous êtes sur 8.3 ou avant, il n'est pas intégré dans le
unnest
fonction, mais vous pouvez rouler votre propre (pas très efficace) de remplacement:Vous êtes les bienvenus - j'ai ajouté un
unnest
fonction pour n'importe qui qui est sur <8.4 (pas vous bien sûr, comme vous l'avez déjà dit qu'il travaille pour vous)OriginalL'auteur
Essayer cette requête à la place.
LEFT JOIN
au lieu deOUTER JOIN
.Merci pour la suggestion, mais ni JOINTURE INTERNE, ni à GAUCHE REJOINDRE fait le tour. LEFT JOIN renvoie toutes les lignes où la barre est définie, et j'ai besoin de retourner une ligne pour chaque valeur requise de la barre, s'il existe dans le foobar table ou pas. C'est mon problème.
OriginalL'auteur Glen Solsberry
OriginalL'auteur Quassnoi