Używając wersji SQL firmy Microsoft , oto moje proste zapytanie. Jeśli zapytam o rekord, który nie istnieje, nic nie zostanie zwrócone. Wolałbym, aby w tym scenariuszu zwracano wartość false (0). Poszukiwanie najprostszej metody na zlikwidowanie rekordów.
SELECT CASE
WHEN S.Id IS NOT NULL AND S.Status = 1 AND (S.WebUserId = @WebUserId OR S.AllowUploads = 1) THEN 1
ELSE 0
END AS [Value]
FROM Sites S
WHERE S.Id = @SiteId
Jest to podobne do Adama Robinsona, ale używa ISNULL zamiast COUNT.
Jeśli zapytanie wewnętrzne ma pasujący wiersz, zwracana jest 1. Zapytanie zewnętrzne (z ISNULL) zwraca następnie tę wartość 1. Jeśli zapytanie wewnętrzne nie ma pasującego wiersza, to nic nie zwraca. Zapytanie zewnętrzne traktuje to jak NULL, więc ISNULL w końcu zwraca 0.
źródło
Może to być martwy koń. Innym sposobem na zwrócenie 1 wiersza, gdy nie ma żadnych wierszy, jest wysłanie do UNION innego zapytania i wyświetlenie wyników, jeśli nie istnieją w tabeli.
źródło
SELECT 0
), a następnie zrobiłemSUM
na tej unii. Proste i łatwe do naśladowania.Coś jak:
źródło
select 1
iselect 2
dodanymas <colName>
Przeczytałem wszystkie odpowiedzi tutaj i zajęło trochę czasu, zanim zrozumiałem, co się dzieje. Poniższe informacje oparte są na odpowiedzi udzielonej przez udzielonej Moe Sisko i kilku powiązanych badaniach
Jeśli zapytanie SQL nie zwraca żadnych danych, nie ma pola z wartością null, więc ani ISNULL, ani COALESCE nie będą działać tak, jak chcesz. Używając zapytania podrzędnego, zapytanie najwyższego poziomu pobiera pole z wartością null, a zarówno ISNULL, jak i COALESCE będą działać tak, jak chcesz / oczekujesz.
Moje zapytanie
Moje zapytanie z komentarzami
źródło
Musisz tylko zamienić GDZIE na LEFT JOIN:
To rozwiązanie pozwala również zwrócić domyślne wartości dla każdej kolumny, na przykład:
źródło
Brak dopasowanego rekordu oznacza, że żaden rekord nie został zwrócony. Nie ma miejsca dla „wartości” 0, jeśli nie zostaną znalezione żadne rekordy. Możesz utworzyć szalone zapytanie UNION, aby zrobić to, co chcesz, ale o wiele, dużo, dużo lepiej po prostu sprawdzić liczbę rekordów w zestawie wyników.
źródło
To może być w jedną stronę.
źródło
A co z Krawatami?
źródło
źródło
Odpowiedź @ hai-phan
LEFT JOIN
jest kluczem, ale może być trochę trudna do zrozumienia. Miałem skomplikowane zapytanie, które również może nic nie zwrócić. Po prostu uprościłem jego odpowiedź na moją potrzebę. Do zapytania z wieloma kolumnami można łatwo zastosować.źródło
źródło