2010-04-21 8 views
52

Oto moje proste zapytanie. Jeśli wyślę zapytanie do rekordu, który nie istnieje, nic nie zostanie zwrócone. Wolałbym, aby w tym scenariuszu zwracana była wartość false (0). Poszukuję metody simplist, aby nie uwzględniać żadnych rekordów.Zwróć wartość, jeśli nie zostaną znalezione żadne wiersze. SQL

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 

Odpowiedz

39
SELECT CASE WHEN COUNT(1) > 0 THEN 1 ELSE 0 END AS [Value] 

FROM Sites S 

WHERE S.Id = @SiteId and S.Status = 1 AND 
     (S.WebUserId = @WebUserId OR S.AllowUploads = 1) 
4

Brak rekordów oznacza, że ​​nie powrócił rekord. Nie ma miejsca na "wartość" 0, jeśli nie znaleziono żadnych rekordów. Możesz stworzyć zwariowaną kwerendę UNION, aby zrobić to, co chcesz, ale o wiele, dużo, dużo lepiej po prostu sprawdzić liczbę rekordów w zestawie wyników.

+0

Obecnie to właśnie robię. Sprawdź, czy liczba rekordów jest pusta, czy nie. Pomyślałem, że to może być sposób na skrócenie mojego czeku. – Matt

73

Jest to podobne do Adam Robinson, ale używa ISNULL zamiast COUNT.

SELECT ISNULL(
(SELECT 1 FROM Sites S 
WHERE S.Id = @SiteId and S.Status = 1 AND 
     (S.WebUserId = @WebUserId OR S.AllowUploads = 1)), 0) 

Jeśli zapytanie wewnętrzne ma pasujący wiersz, zwracana jest wartość 1. Zapytanie zewnętrzne (z ISNULL) następnie zwraca tę wartość 1. Jeśli zapytanie wewnętrzne nie ma pasującego wiersza, to nic nie zwraca. Zapytanie zewnętrzne traktuje to jak NULL, a więc ISNULL kończy się zwracaniem 0.

+0

Dziękujemy za dodanie tego! Dokładnie to, czego potrzebuję, ponieważ mogłem po prostu WYBRAĆ ISNULL ((SELECT Id ... zamiast 1, aby uzyskać dane, których szukałem!) –

+0

Bardzo późno, wiem, ale można zastąpić ISNULL COALESCE, aby uzyskać ten sam wynik . – BlueChippy

+0

Przyzwyczaiłem się używać COALESCE zamiast ISNULL, ponieważ z pamięci (nawyki wymierają), ISNULL nie jest dostępny w SQL Lite lub jakkolwiek się nazywa, który działa na starszych urządzeniach z Windows Mobile. COALESCE działa na obu, lite, Express i pełnowymiarowe SQL. – Ads

9

To może być martwy koń, innym sposobem na zwrócenie 1 wiersza, gdy nie ma żadnych wierszy jest UNION inne zapytanie i wyświetla wyniki, gdy nie istnieją na stole.

SELECT S.Status, COUNT(s.id) AS StatusCount 
FROM Sites S 
WHERE S.Id = @SiteId 
GROUP BY s.Status 
UNION ALL --UNION BACK ON TABLE WITH NOT EXISTS 
SELECT 'N/A' AS Status, 0 AS StatusCount 
WHERE NOT EXISTS (SELECT 1 
    FROM Sites S 
    WHERE S.Id = @SiteId 
) 
+2

Użyłem podobnej metody, gdy próbuję uzyskać sumy z zapytania. Po prostu wykonałem połączenie z zapytaniem, które zwróciło 0 ('SELECT 0'), a następnie zrobiłem' SUMA' na złączu. Prosty i łatwy do naśladowania. – cjbarth

+2

Jeśli zwróci 2 wiersze, czy gwarantuje, że wiersze zostaną zwrócone w oczekiwanej kolejności? –

+0

I to jest ciężki plan wykonania – Fandango68

6

Coś jak:

if exists (select top 1 * from Sites S where S.Id IS NOT NULL AND S.Status = 1 AND (S.WebUserId = @WebUserId OR S.AllowUploads = 1)) 
    select 1 
else 
    select 0 
+0

Użyłem tego rozwiązania, ponieważ ma to dla mnie więcej sensu (nie jestem tradycyjnie użytkownikiem SQL), jednak używam programu SQL Server, odkryłem, że dodanie nazwy kolumny do tego zaokrąglone to rozwiązanie ładnie. tj. po twoim 'wybierz 1' i' wybierz 2' dodałem 'jako ' – Harvey

3

Trzeba tylko wymienić gdzie za LEFT JOIN:

SELECT CASE 
     WHEN S.Id IS NOT NULL AND S.Status = 1 AND ...) THEN 1 
     ELSE 0 
    END AS [Value] 

    FROM (SELECT @SiteId AS Id) R 
    LEFT JOIN Sites S ON S.Id = R.Id 

To rozwiązanie pozwala na powrót domyślne wartości dla każdej kolumny również dla przykład:

SELECT 
    CASE WHEN S.Id IS NULL THEN 0 ELSE S.Col1 END AS Col1, 
    S.Col2, 
    ISNULL(S.Col3, 0) AS Col3 
FROM 
    (SELECT @Id AS Id) R 
    LEFT JOIN Sites S ON S.Id = R.Id AND S.Status = 1 AND ... 
5

Przeczytałem wszystkie odpowiedzi tutaj i zajęło to trochę czasu, aby dowiedzieć się, co się dzieje. Poniżej znajduje się odpowiedź na pytanie: Moe Sisko i niektóre powiązane badania:

Jeśli twoje zapytanie SQL nie zwraca żadnych danych, nie ma pola z wartością pustą, więc ani ISNULL, ani COALESCE nie będą działać tak, jak chcesz. Dzięki kwerendom podrzędnym kwerenda najwyższego poziomu otrzymuje pole o zerowej wartości, a zarówno ISNULL, jak i COALESCE będą działały zgodnie z oczekiwaniami/oczekiwaniami.

Moje zapytanie

select isnull(
(select ASSIGNMENTM1.NAME 
from dbo.ASSIGNMENTM1 
where ASSIGNMENTM1.NAME = ?) 
, 'Nothing Found') as 'ASSIGNMENTM1.NAME' 

moje zapytanie z komentarzami

select isnull(
--sub query either returns a value or returns nothing (no value) 
(select ASSIGNMENTM1.NAME 
from dbo.ASSIGNMENTM1 
where ASSIGNMENTM1.NAME = ?) 
--If there is a value it is displayed 
--If no value, it is perceived as a field with a null value, 
--so the isnull function can give the desired results 
, 'Nothing Found') as 'ASSIGNMENTM1.NAME' 
0

To może być jednym ze sposobów.

SELECT TOP 1 [Column Name] FROM (SELECT [Column Name] FROM [table] 
    WHERE [conditions] 
    UNION ALL 
    SELECT 0)A ORDER BY [Column Name] DESC 
1

Co z opaskami?

SELECT TOP 1 WITH TIES tbl1.* FROM 
     (SELECT CASE WHEN S.Id IS NOT NULL AND S.Status = 1 
         AND (S.WebUserId = @WebUserId OR 
          S.AllowUploads = 1) 
        THEN 1 
        ELSE 0 AS [Value] 
     FROM Sites S 
     WHERE S.Id = @SiteId) as tbl1 
ORDER BY tbl1.[Value] 
Powiązane problemy