2009-12-23 5 views
5

Comment savoir si toutes les cellules ont la même valeur dans une colonne (titre modifié)Comment savoir si toutes les cellules ont la même valeur dans une colonne

Je veux avoir un peu valeur scalaire qui me dit si toutes les valeurs d'une colonne égale quelque chose:

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

MISE à JOUR

Je réalise maintenant que je ne suis pas vraiment besoin du TrueForAll, ce que je besoin est de vous assurer que toutes les valeurs une colonne sont égaux, par exemple, je veux t o savoir si tous les Group.Items ont le même prix.

Répondre

4

Pour quelque chose exigence mise à jour comme cela semble faire ce que vous voulez:

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

Lorsque le compte est plus le 1, vous avez deux noms différents (ou des prix en fonction de ce que vous groupe sur)

+0

Ou juste 'sélectionner count (nom) de Contact', non? – Blorgbeard

+1

@Blorgbeard La sous-sélection donne le nombre de groupes. Sans cela, vous obtenez simplement plusieurs enregistrements (un par groupe). Les chevaux pour les cours vraiment. –

1

Peut-être que cela?

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

Saint @@@@ qui était si rapide! – Shimmy

+0

Bien sûr, c'est le contraire de la logique exprimée dans la question du PO. Il devrait être 'WHERE Name IS NULL' et mettre le' bit' à 0, sinon placez-le à 1. –

+0

Exists retournera vrai si 1+ enregistrements satisfont la logique –

0

Cela résout votre première question:

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

AJOUTÉE:

Cela permettra de résoudre votre deuxième:

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 

Par ailleurs, lorsque vous utilisez la fonction exists, il est préférable de sélectionner 1 (une constante) afin d'obtenir moins de données.

1

pas très bon pour NULLs, mais 2008 peut faire:

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

OU

DECLARE @bit bit 

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

MISE À JOUR

Toutes les même couleur

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

J'utilise 2005 mais bon à savoir, merci de poster. – Shimmy

13

Pourquoi pas?

select count(distinct price) from table 

Si renvoie 1, toutes les valeurs sont les mêmes ... Ajouter

where price is not null

si besoin est

+0

upvoted pour count (distinct x), ce qui semble être la solution la plus évidente pour moi (certainement le premier que je pensais) et est également valide ANSI SQL 92, et donc cross-playform que vous obtiendrez. – Cowan

+0

Enfin, une utilisation non-hacky pour 'SELECT DISTINCT'. – bonh

Questions connexes