Betrachten Sie diese select-Anweisung:
SELECT *,
1 AS query_id
FROM players
WHERE username='foobar';
Es gibt die Spalte query_id
mit dem Wert 1
zusammen mit den anderen Spalten eines Spielers zurück.
Wie würde man die obige SQL-Anweisung dazu bringen, zumindest die query_id
von 1
selbst zurückzugeben, wenn die Auswahl keine übereinstimmenden Zeilen findet?
Übrigens ist es PostgreSQL 8.4.
postgresql
select
null
Nathanael Weiss
quelle
quelle
order by
. Die zweite "erstellt" eine virtuelle Tabelle mit genau einer Zeile und einer Spalte und führt einen Outer-Join durch (ohne "echte" Join-Bedingung), sodass Sie immer mindestens diese eine Zeile zurückerhalten. Die Verwendung vonselect *
Code in der Produktion ist ein schlechter Stil. Tu es nicht. Listen Sie immer die Spalten auf, die Sie benötigen.select *
sollte nur in Ad-hoc-Abfragen verwendet werden.left join
ist nicht lesbar?UNION ALL
Kann manchmal effizienter sein alsUNION
, da Sie dem Abfrageplaner explizit mitteilen, dass entweder erwartet wird, dass keine doppelten Zeilen aus denUNION
ed-Abfragen kommen, oder wenn Sie möchten, dass sie ausgegeben werden. Ohne denALL
Modifikator wird davon ausgegangen, dass Sie doppelte Zeilen entfernen möchten (von denen jeweils nur eine zurückgegeben wird), ähnlich wie beimDISTINCT
Schlüsselwort, und um sicherzustellen, dass die Ergebnisse möglicherweise erneut durchsucht werden müssen. Verwenden Sie alsoALL
mit, esUNION
sei denn, Sie benötigen speziell die Deduplizierung von Ausgabezeilen.Wenn Sie nur eine oder null Zeilen zurück erwarten, dann würde dies auch funktionieren:
Dies gibt eine Zeile mit allen Werten mit Null zurück, außer query_id, wenn keine Zeile gefunden wird.
quelle
username = 'foobar'
Ich stimme hier spät zu, aber hier ist eine Syntax, die funktioniert (zumindest in 9.2, ich habe frühere Versionen nicht ausprobiert).
Gibt die "leere" Zeile nur zurück, wenn der gesamte Inhalt von "a" null ist.
Genießen. / bithead
quelle
quelle