10

如何知道某列中的所有单元格是否具有相同的值(标题已更改)

我想要一个标量值来告诉我列中的所有值是否都相等:

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

更新

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

4

5 回答 5

17

为什么不?

select count( distinct price) from table

如果返回 1,则所有值都相同... 添加

where price is not null

如果需要的话

于 2009-12-23T04:13:40.600 回答
6

对于您更新的要求,这样的事情似乎可以满足您的要求:

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

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

于 2009-12-23T02:04:13.067 回答
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 
于 2009-12-23T02:27:52.323 回答
1

也许这个?

DECLARE @bit bit
if exists(SELECT Name FROM Contact WHERE Name IS NULL) 
   SET @bit = 0
ELSE
  SET @bit = 1
于 2009-12-23T01:50:06.343 回答
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(常量),这样返回的数据更少

于 2009-12-23T01:55:28.120 回答