【问题标题】:Get Rows With At Least Two Non Zero Columns获取至少包含两个非零列的行
【发布时间】:2015-01-16 13:56:18
【问题描述】:

假设我有下表:

CREATE TABLE person
(
  key integer NOT NULL AI ,
  name varchar NOT NULL DEFAULT 0,
  column1 integer NOT NULL DEFAULT 0,
  column2 integer NOT NULL DEFAULT 0,
  column3 integer NOT NULL DEFAULT 0,
  column4 integer NOT NULL DEFAULT 0,
  column5 integer NOT NULL DEFAULT 0,
  column6 integer NOT NULL DEFAULT 0,

  CONSTRAINT pk PRIMARY KEY (key)
)

现在我想要一个 sql,它可以让我得到至少有两列值非零的行,对于列 column1 到 column6。

例如如果我们有行

1 TEST 0 0 6 1 0 5
2 ABCD 0 0 0 0 0 5
3 DEFG 0 0 4 1 0 5
4 HIJK 0 0 0 1 0 0

所以我的查询应该返回 ID 1 和 3,因为它们至少有 2 个非零列。

【问题讨论】:

    标签: mysql sql select


    【解决方案1】:

    试试这个:

    SELECT * 
    FROM person
    WHERE (column1 <> 0 + column2 <> 0 + column3 <> 0 + 
           column4 <> 0 + column5 <> 0 + column6 <> 0
          ) > 1;
    

    SELECT p.*
    FROM person p 
    INNER JOIN (SELECT A.key 
                FROM (SELECT p.key, p.column1 AS columnData FROM person p WHEN p.column1 <> 0
                      UNION ALL
                      SELECT p.key, p.column2 AS columnData FROM person p WHEN p.column2 <> 0
                      UNION ALL
                      SELECT p.key, p.column3 AS columnData FROM person p WHEN p.column3 <> 0
                      UNION ALL
                      SELECT p.key, p.column4 AS columnData FROM person p WHEN p.column4 <> 0
                      UNION ALL
                      SELECT p.key, p.column5 AS columnData FROM person p WHEN p.column5 <> 0
                      UNION ALL
                      SELECT p.key, p.column6 AS columnData FROM person p WHEN p.column6 <> 0
                     ) AS A 
                GROUP BY A.key 
                HAVING COUNT(*) > 1
               ) AS A ON p.key = A.key;
    

    【讨论】:

    • 子选择将非常有效,初始(仅计算非零字段)更加清晰和高效。虽然第二种选择可行,但我建议将其从答案中删除。
    • 第二个选项中不需要 UNION ALL 吗? (以防万一 col1 = col2)
    • 您的第一个解决方案在 SQL fiddle 中不起作用。我不知道为什么,因为 JeurgenD 的解决方案确实如此。
    • 第一个解决方案对我来说效果很好,但我需要将每个 columnx &lt;&gt; 0 括在括号中。
    【解决方案2】:

    统计0列的个数:

    where case when c1 = 0 then 1 else 0 end + case when c2 = 0 then 1 else 0 end ... >= 2
    

    【讨论】:

    • 更容易使用第一个结果,利用添加布尔结果,其中 true 变为 1,false 为零
    猜你喜欢
    • 2019-12-09
    • 2020-05-04
    • 2020-12-28
    • 2013-03-27
    • 2019-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多