获取至少包含两个非零列的行
Get Rows With At Least Two Non Zero Columns
假设我有以下 table:
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
所以我的查询应该 return ID 1 和 3,因为它们至少有 2 个非零列。
统计0列的个数:
where case when c1 = 0 then 1 else 0 end + case when c2 = 0 then 1 else 0 end ... >= 2
试试这个:
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;
假设我有以下 table:
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
所以我的查询应该 return ID 1 和 3,因为它们至少有 2 个非零列。
统计0列的个数:
where case when c1 = 0 then 1 else 0 end + case when c2 = 0 then 1 else 0 end ... >= 2
试试这个:
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;