2009-12-23 14 views
5

¿Cómo saber si todas las células tienen el mismo valor en alguna columna (título cambiado)¿Cómo saber si todas las células tienen el mismo valor en alguna columna

Quiero tener un valor escalar poco que me dice si todos los valores en una columna igual algo:

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

ACTUALIZACIÓN

ahora me di cuenta de que en realidad no necesito el TrueForAll, lo que necesito es asegurarse de que todos los valores de una columna son iguales, por ejemplo, quiero t o saber si todos los artículos del grupo tienen el mismo precio.

Respuesta

4

Para su requisito algo actualizado como esto parece hacer lo que quiera:

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

Cuando el recuento es superior al 1 tiene dos nombres diferentes (o precios dependiendo de lo que el grupo de)

+0

O simplemente 'seleccione conteo (nombre) de Contacto', ¿verdad? – Blorgbeard

+1

@Blorgbeard La subselección proporciona el recuento de la cantidad de grupos. Sin eso, solo obtienes múltiples registros (uno por grupo). Caballos para cursos realmente. –

1

Quizás esto?

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

Santo @@@@ que fue tan rápido! – Shimmy

+0

Por supuesto, esto es lo contrario de la lógica expresada en la pregunta del OP. Debería ser 'WHERE Name IS NULL' y establecer 'bit' en 0; de lo contrario, establézcalo en 1. –

+0

Exists devolverá true si 1+ records satisface la lógica –

0

Esto resuelve su primera pregunta:

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

añadido:

Esto va a resolver su segundo:

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 

Por cierto, cuando se utiliza la función existe, es mejor SELECCIONAR 1 (una constante) por lo que se devuelven menos datos

1

no es muy bueno para los nulos, pero el 2008 puede hacer:

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 

ACTUALIZACIÓN

Todas mismo color

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

Estoy usando 2005 pero es bueno saberlo, gracias por publicarlo. – Shimmy

13

Por qué no?

select count(distinct price) from table 

Si devuelve 1, todos los valores son los mismos ... Añadir

where price is not null

si es necesario

+0

upvoted para count (distinct x), que parece ser la solución más obvia aquí para mí (sin duda la primera en la que pensé) y también es válida ANSI SQL 92, y por lo tanto, como cross-playform obtendrá. – Cowan

+0

Finalmente, un uso no hacky para 'SELECT DISTINCT'. – bonh

Cuestiones relacionadas