2009-12-23 4 views
5

Wie müssen wissen, ob alle Zellen in irgendeiner Spalte den gleichen Wert haben (Titel geändert)Wie kann man wissen, wenn alle Zellen den gleichen Wert in irgendeiner Spalte

ich ein bisschen skalaren Wert haben wollen, die mir sagt, wenn alle Werte in einer Spalte gleich etwas:

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

UPDATE

ich erkennen jetzt, dass ich eigentlich nicht den TrueForAll brauche, was ich brauche sind, um sicherzustellen, dass alle Werte in eine Spalte sind gleich, zum Beispiel möchte ich t o wissen, ob alle Group.Items den gleichen Preis haben.

Antwort

4

Für Ihre aktualisierte Anforderung so etwas wie dies scheint zu tun, was Sie wollen:

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

Wenn der Zählwert größer ist die 1 Sie haben zwei verschiedene Namen (oder Preise je nachdem, was Sie Gruppe)

+0

Oder einfach 'count (name) von Kontakt auswählen ', oder? – Blorgbeard

+1

@Blorgbeard Der Subselect gibt die Anzahl der Gruppen an. Ohne dass Sie nur mehrere Datensätze erhalten (einen pro Gruppe). Pferde für Kurse wirklich. –

1

Vielleicht das?

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

Heilige @@@@ sein muss, die so schnell war! – Shimmy

+0

Natürlich ist dies das Gegenteil der Logik, die in der Frage des OP ausgedrückt wird. Es sollte 'WHERE Name IS NULL' sein und das' Bit' auf 0 setzen, ansonsten auf 1 setzen. –

+0

Existiere werden wahr wenn 1+ Datensätze die Logik erfüllen –

0

Dies löst Ihre erste Frage:

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

ZUSÄTZLICH:

Dies wird lösen Ihre zweite:

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 

By the way, wenn Sie die Funktion vorhanden ist, Es ist besser, SELECT 1 (eine Konstante), so dass weniger Daten zurückgegeben werden

1

nicht sehr gut für NULL-Werte, aber 2008 tun können:

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

ODER

DECLARE @bit bit 

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

UPDATE

alle gleiche Farbe

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

Ich benutze 2005 aber gut zu wissen, danke für die Veröffentlichung. – Shimmy

13

Warum nicht?

select count(distinct price) from table 

Wenn 1 zurückkehrt, werden alle Werte gleich sind ... In

where price is not null

wenn

+0

upvoted für count (distinct x), was für mich die offensichtlichste Lösung zu sein scheint (sicherlich die erste, an die ich dachte) und ist auch gültig ANSI SQL 92, und so Cross-Play-Form wie Sie bekommen. – Cowan

+0

Schließlich, eine nicht-Hacky Verwendung für SELECT DISTINCT. – bonh

Verwandte Themen