如何确定某列中的所有单元格是否具有相同的值

12

如何知道某一列中所有单元格的值是否相同

我想要一个简单的标量值来告诉我,某一列中的所有值是否都等于某个特定值:

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

更新

我现在意识到,实际上我并不需要TrueForAll,我需要的是确保一列中的所有值都相等,例如,我想知道所有Group.Items是否具有相同的价格。

5个回答

20

为什么不呢?

select count( distinct price) from table
如果返回值为1,则所有值都相同... 添加 where price is not null 如果需要的话。

我为count(distinct x)点赞,这对我来说似乎是最明显的解决方案(当然是我想到的第一个),并且也是有效的ANSI SQL 92,因此它是跨平台的。 - Cowan
终于,SELECT DISTINCT 有了一个非常规的用途。 - bonh
比标记的答案更清晰明了的解决方案。 - Muzaffer Galata

7
根据您的最新需求,以下内容似乎可以实现您的要求:
DECLARE @IsSameGroup bit
SELECT @IsSameGroup = CASE WHEN COUNT(*) > 1 THEN 0 ELSE 1 END
FROM (SELECT Name FROM Contact GROUP BY Name) groups

当数量大于1时,您有两个不同的名称(或价格,取决于您分组的内容)。


1
@Blorgbeard 子查询给出了组数的计数。如果没有它,你只会得到多个记录(每个组一个)。这真的是因人而异。 - David Hall
这样不是更简单明了吗?DECLARE @IsSameGroup bit = (SELECT COUNT() FROM Contact GROUP BY [Name] HAVING COUNT() > 1) - Muzaffer Galata

2

对于NULL值不是很友好,但2008可以处理:

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

或者

DECLARE @bit bit

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

更新

所有颜色相同

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 

1

也许是这个?

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

当然,这与OP问题中表达的逻辑相反。应该是WHERE Name IS NULL并将bit设置为0,否则将其设置为1。 - Adam Robinson
如果有1个或多个记录符合逻辑条件,Exists将返回true。 - OMG Ponies
我在我的问题中犯了一个错误,请您检查一下。谢谢并抱歉。 - Shimmy Weitzhandler

0

这解决了你的第一个问题:

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

附加:

这将解决你的第二个问题:

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

顺便提一下,当您使用exists函数时,最好选择1(常量),这样可以返回更少的数据。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接