2015-01-16 38 views
5

比方說,我有如下表:獲取行至少有兩個非零列

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這讓我這有ATLEAST兩列行的值不爲零的第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個非零列。

回答

3

試試這個:

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

OR

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; 
+0

子選擇將非常有效,初始(簡單計數非零字段)更清晰和更高效。雖然第二種方法可行,但我建議將其從答案中刪除。 – ErstwhileIII

+0

你不需要第二種選擇中的UNION ALL嗎? (以防col1 = col2) – jarlh

+0

您的第一個解決方案在SQL小提琴中不起作用。我不確定爲什麼,因爲JeurgenD的解決方案。 – AdamMc331

0

數0列數:

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

更易於使用的第一個結果,以增加布爾結果的優勢其中true變爲1,false爲零 – ErstwhileIII

相關問題