2015-01-16 8 views
5

Powiedzmy mam poniższej tabeli:Get wiersze z co najmniej dwoma niezerowej Kolumny

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) 
) 

teraz chcę mieć sql, które ulegną mi wiersze, które mają co najmniej dwa słupy wartości zerowe dla kolumny COLUMN1 do column6.

np. jeśli mamy wiersze

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 

więc moje zapytanie powinno zwrócić ID 1 i 3, ponieważ mają co najmniej 2 niezerowe kolumny.

Odpowiedz

3

Spróbuj tego:

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

LUB

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

będzie dość sprawny, początkowy (po prostu liczenie niezerowych pól) jest znacznie bardziej przejrzysty i wydajniejszy. Podczas gdy druga alternatywa zadziałałaby, zalecałbym usunięcie jej z odpowiedzi. – ErstwhileIII

+0

Czy nie potrzebujesz UNION ALL w drugiej alternatywie? (Tylko w przypadku col1 = col2) – jarlh

+0

Twoje pierwsze rozwiązanie nie działa w skrzypcach SQL. Nie jestem pewien, dlaczego, ponieważ rozwiązanie JeurgenD ma. – AdamMc331

0

Policzyć 0 kolumnach:

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

Łatwiejszy w użyciu pierwszy wynik, wykorzystując dodanie logicznych wyników gdzie prawda zmienia się na 1, a fałsz na zero – ErstwhileIII

Powiązane problemy