【问题标题】:How to know if all the cells have the same value in some column如何知道所有单元格在某列中是否具有相同的值
【发布时间】:2010-12-29 08:18:44
【问题描述】:

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

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

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

更新

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

【问题讨论】:

    标签: sql sql-server tsql conditional-statements equivalent


    【解决方案1】:

    为什么不呢?

    select count( distinct price) from table
    

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

    where price is not null

    如果需要的话

    【讨论】:

    • 赞成 count(distinct x),这对我来说似乎是最明显的解决方案(当然是我想到的第一个解决方案),也是有效的 ANSI SQL 92,以及跨游戏形式你会得到的。
    • 最后,SELECT DISTINCT 的非hacky用法。
    【解决方案2】:

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

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

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

    【讨论】:

    • @Blorgbeard 子选择给出组数的计数。没有它,您只会获得多条记录(每组一条)。真的很适合课程。
    【解决方案3】:

    也许是这个?

    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。
    • 如果有 1+ 条记录满足逻辑,Exists 将返回 true
    • 我的问题有误,请查看。谢谢和抱歉。
    【解决方案4】:

    对于 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 
    

    【讨论】:

      【解决方案5】:

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

      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(一个常量),这样返回的数据更少

      【讨论】:

        猜你喜欢
        • 2011-09-07
        • 1970-01-01
        • 2013-09-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-09-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多