Rozważ tę wybraną instrukcję:
SELECT *,
1 AS query_id
FROM players
WHERE username='foobar';
Zwraca kolumnę query_id
z wartością 1
wraz z innymi kolumnami gracza.
Jak sprawić, by powyższy SQL zwrócił przynajmniej ten query_id
z, 1
nawet jeśli zaznaczenie nie znajdzie pasujących wierszy?
BTW, to PostgreSQL 8.4.
postgresql
select
null
Nathanael Weiss
źródło
źródło
order by
. Drugi „tworzy” wirtualną tabelę z dokładnie jednym rzędem i jedną kolumną i wykonuje zewnętrzne połączenie (bez żadnych „rzeczywistych” warunków łączenia), dlatego zawsze otrzymujesz co najmniej ten jeden wiersz. Używanieselect *
w kodzie produkcyjnym jest złym stylem. Nie rób tego Zawsze wymieniaj kolumny, których potrzebujesz.select *
powinien być używany tylko w zapytaniach ad-hoc.left join
jest czytelny?UNION ALL
może czasami być bardziej wydajny niżUNION
, ponieważ wyraźnie powiadamiasz planistę zapytań, że albo spodziewasz się, że nie będzie żadnych zduplikowanych wierszy zUNION
zapytań ed lub jeśli tam chcesz, żeby były wyprowadzane. BezALL
modyfikatora zakłada się, że chcesz usunąć zduplikowane wiersze (tylko jeden z każdego zwróconego), podobnie jak w przypadkuDISTINCT
słowa kluczowego, i aby zagwarantować, że może być konieczne dodatkowe użycie + ponownego przeskanowania wyników. Więc używajALL
z,UNION
chyba że potrzebujesz konkretnej duplikacji wiersza wyjściowego.Jeśli oczekujesz tylko jednego lub zerowego wiersza z powrotem, to również działałoby:
Zwróci jeden wiersz ze wszystkimi wartościami o wartości null, z wyjątkiem query_id, jeśli nie zostanie znaleziony wiersz.
źródło
username = 'foobar'
Chiming tutaj późno tutaj, ale oto składnia, która działa (przynajmniej w wersji 9.2, nie wypróbowałem wcześniejszych wersji).
Zwróci „pusty” wiersz tylko wtedy, gdy cała zawartość „a” jest pusta.
Cieszyć się. / bithead
źródło
źródło