返回与列中所有布尔值匹配的行

时间:2018-01-23 15:29:12

标签: sql sql-server

我有一张这样的表:

    ID  |  Boolean 
    ================
    1   | TRUE     
    1   | FALSE  
    1   | TRUE
    2   | TRUE 
    2   | TRUE
    2   | FALSE
    3   | FALSE
    3   | FALSE
    3   | FALSE

我想要获得的是ID仅出现为“错误”的ID。在布尔列中,所以我的结果应该看起来像

    3

我粗略的SQL如下:

    SELECT DISTINCT ID, Boolean
    FROM FakeTable
    WHERE Boolean = 'False'

关于尽可能基本的。但是,当然,当我这样做时,我得到以下结果:

    1
    2
    3

显然,因为每个ID都至少有一个“假”错误。在布尔列中。我怎么能缩小它呢?

4 个答案:

答案 0 :(得分:1)

一个快速选项

假设BooleanBIT,我们可以使用隐式转化,因此0+Boolean

Select ID 
 from YourTable
 Group By ID
 Having max(0+Boolean)=0

答案 1 :(得分:1)

这只给出那些有假而不是真正成分的东西。

我从嵌套查询更改为JOIN

SELECT DISTINCT A.ID, A.Boolean
    FROM FakeTable A
        LEFT OUTER JOIN FakeTable B on A.ID=B.ID AND B.Boolean='True'
    WHERE A.Boolean = 'False' AND B.ID IS NULL

答案 2 :(得分:0)

这将有效:

SELECT DISCTINCT ID
FROM FakeTable ft1
WHERE NOT EXISTS(
    SELECT ID
    FROM FakeTable ft2
    WHERE ft2.ID = ft1.ID
    AND ft2.Boolean = 'True'
)

我没有测试过,但也应该工作:

SELECT ID
FROM FakeTable
GROUP By ID
HAVING MAX(CASE Boolean WHEN 'True' THEN 1 ELSE 0 END) = 0

答案 3 :(得分:0)

您可以使用汇总功能SUM

  

您需要将BIT转换为INT,因为BIT对SUM运算符

无效
SELECT ID
FROM FakeTable
GROUP BY ID
HAVING SUM(CAST(Boolean AS INT)) = 0