2009-12-23 18 views
5

Come sapere se tutte le cellule hanno lo stesso valore in qualche colonna (titolo cambiato)Come sapere se tutte le cellule hanno lo stesso valore in qualche colonna

voglio avere un valore scalare po 'che mi dice se tutti i valori di una colonna uguale qualcosa:

DECLARE @bit bit 
SELECT @bit = TRUEFORALL(Name IS NOT NULL) FROM Contact 

UPDATE

ora mi sono reso conto che in realtà non è necessario il TrueForAll, quello che ho bisogno è quello di fare in modo, che tutti i valori in una colonna è uguale, ad esempio, voglio t o sapere se tutti gli articoli di Group. hanno lo stesso prezzo.

risposta

4

Per il vostro qualcosa requisito aggiornato come questo sembrerebbe di fare ciò che si vuole:

DECLARE @IsSameGroup bit 
SELECT @IsSameGroup = CASE WHEN COUNT(*) > 1 THEN 0 ELSE 1 END 
FROM (SELECT Name FROM Contact GROUP BY Name) groups 

Quando il conteggio è maggiore del 1 si hanno due nomi diversi (o dei prezzi a seconda di ciò che si gruppo su)

+0

O semplicemente 'seleziona il conteggio (nome) da Contatto', giusto? – Blorgbeard

+1

@Blorgbeard La sottoselezione fornisce il conteggio del numero di gruppi. Senza di ciò ottieni solo più record (uno per gruppo). Cavalli per i corsi davvero. –

1

Forse questo?

DECLARE @bit bit 
if exists(SELECT Name FROM Contact WHERE Name IS NULL) 
    SET @bit = 0 
ELSE 
    SET @bit = 1 
+1

Santa @@@@ che era così veloce! – Shimmy

+0

Ovviamente, questo è l'opposto della logica espressa nella domanda dell'OP. Dovrebbe essere 'WHERE Name IS NULL' e impostare il' bit' su 0, altrimenti impostarlo su 1. –

+0

Exists restituirà true se 1+ record soddisfano la logica –

0

Questo risolve la vostra prima domanda:

SELECT 
    CASE 
     WHEN EXISTS(
      SELECT 1 
      FROM Contact 
      WHERE Name IS NULL 
     ) THEN 0 
     ELSE 1 
    END 

aggiunto:

questo risolverà il secondo:

SELECT 
    CASE 
     WHEN EXISTS(
      SELECT TOP 1 1 FROM (
       SELECT 
        ItemGroupName, 
        COUNT(Price) AS CNT 
       FROM ItemGroup 
       GROUP BY ItemGroupName 
       HAVING COUNT(Price) > 1 
      ) t 
     ) THEN 0 
     ELSE 1 
    END 

A proposito, quando si utilizza la funzione esiste, è meglio selezionare 1 (una costante) in modo da restituire meno dati

1

non molto buono per i NULL, ma il 2008 può fare:

SELECT 1 WHERE 'Blue' = ALL (SELECT Color FROM dbo.Hat) 

O

DECLARE @bit bit 

SET @bit = 
CASE (SELECT 1 WHERE 'Blue' = ALL (SELECT Color FROM dbo.Hat)) 
WHEN 1 THEN 1 ELSE 0 END 

UPDATE

Tutti stesso colore

SET @bit = 
CASE(
    SELECT 1 WHERE 
    (SELECT TOP(1) Color FROM dbo.Hat) = ALL (SELECT Color FROM dbo.Hat) 
    ) 
WHEN 1 THEN 1 ELSE 0 END 
+0

Sto usando il 2005 ma buono a sapersi, grazie per la pubblicazione. – Shimmy

13

Perché no?

select count(distinct price) from table 

Se restituisce 1, tutti i valori sono gli stessi ... Aggiungi

where price is not null

se c'è bisogno di essere

+0

upvoted per count (distinto x), che sembra essere la soluzione più ovvia qui per me (sicuramente la prima che ho pensato) ed è ANSI SQL 92 valido, e quindi come cross-playform come si otterrà. – Cowan

+0

Infine, un uso non hacky per 'SELECT DISTINCT'. – bonh

Problemi correlati