2010-04-21 15 views
52

Ecco la mia semplice query. Se interrogo un record che non esiste, non riceverò nulla. Preferirei che false (0) sia restituito in quello scenario. Alla ricerca del metodo semplicistico per non tenere conto di nessun record.Restituisce un valore se nessuna riga si trovano 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 

risposta

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

Nessun record corrisponde a nessun record restituito. Non c'è posto per il "valore" di 0 per andare se non vengono trovati record. È possibile creare una query UNION pazzesca per fare ciò che si desidera ma molto, molto, molto meglio semplicemente per controllare il numero di record nel set di risultati.

+0

Attualmente, questo è quello che faccio. Controlla quale è il numero di record vuoto o no. Pensavo che potessero essere un modo per scorciare il mio assegno. – Matt

73

Questo è simile a Adam Robinson, ma utilizza ISNULL invece di 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) 

Se la query interna ha una riga corrispondente, viene restituito 1. La query esterna (con ISNULL) restituisce quindi questo valore di 1. Se la query interna non ha una riga corrispondente, quindi non restituisce nulla. La query esterna considera questo come un valore NULL, quindi l'ISNULL termina con la restituzione 0.

+0

Grazie per aver aggiunto questo! È esattamente quello di cui ho bisogno, poiché potrei semplicemente selezionare ISNULL ((ID SEL ... invece di 1 per ottenere i dati che stavo cercando! –

+0

Molto tardi, lo so, ma puoi sostituire ISNULL con COALESCE per ottenere lo stesso risultato . – BlueChippy

+0

Ho preso l'abitudine di usare COALESCE piuttosto che ISNULL perché, dalla memoria (le abitudini muoiono duramente), ISNULL non è disponibile in SQL Lite o come si chiama che gira su dispositivi Windows Mobile precedenti. COALESCE funziona su SQL sia in formato Lite che Express e in full-blown. – Ads

9

Questo potrebbe essere un cavallo morto, un altro modo per restituire 1 riga quando non ci sono righe è UNION un'altra query e visualizzare i risultati quando non esiste sul tavolo.

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

Ho usato un metodo simile quando cercavo di ottenere i totali da una query. Ho semplicemente fatto un sindacato con una query che ha restituito 0 ('SELECT 0'), quindi ho fatto un' SUM' sul sindacato. Semplice e facile da seguire. – cjbarth

+2

Se restituisce 2 righe, è garantito che le righe vengano restituite nell'ordine previsto? –

+0

Ed è pesante sul piano di esecuzione – Fandango68

6

Qualcosa di simile:

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

Ho usato questa soluzione come ha più senso per me (non sono tradizionalmente un utente SQL), Tuttavia, sto usando SQL Server, ho trovato che l'aggiunta del nome del col a questo arrotondato questo soluzione bene. cioè dopo il tuo 'selezionare 1' e' selezionare 2' ho aggiunto 'come ' – Harvey

3

Basta sostituire la dove con un 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 

Questa soluzione consente di restituire i valori predefiniti per ogni colonna anche, per esempio:

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

Ho letto tutte le risposte qui e ci è voluto un po 'per capire cosa stava succedendo. Quanto segue si basa sulla risposta di Moe Sisko e su alcune ricerche correlate

Se la query SQL non restituisce alcun dato, non c'è un campo con un valore nullo, quindi né ISNULL né COALESCE funzioneranno come desiderato. Utilizzando una query secondaria, la query di livello superiore ottiene un campo con un valore nullo e ISNULL e COALESCE funzioneranno come desiderato/previsto.

La mia domanda

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

La mia domanda con commenti

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

questo potrebbe essere un modo.

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

Che dire CON TIRI?

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] 
Problemi correlati