Postgresql:检查列是否同时等于多个值的最佳方法
Postgresql: the best way to check if column is equal to multiple values simultaneously
如果我想检查一列是否等于一个值或其他值,我写:
where col1 in (1, 4, 9);
但是如果我想同时检查一列是否等于这些值,
我应该写:
where col1 = 1 and col1 = 4 and col1 = 9;
SQL 中是否有任何缩写形式,例如 in?
示例:
c1 | c2
-----------
1 | 1
1 | 2
1 | 3
Select 来自表名的 c1,其中 c2 = 1 且 c2 = 2;
在结果集中我想要1
PostgreSQL 已将 <operator> ALL
语法扩展到数组,因此您可以使用:
WHERE col1 = ALL (ARRAY[1, 4, 9])
关系划分:
CREATE TABLE ztable
( c1 integer not NULL
, c2 integer not null
, PRIMARY KEY (c1,c2)
);
INSERT INTO ztable(c1,c2) values
(1 , 1) -- [c1=1] should match
,(1 , 2)
,(1 , 3)
,(2 , 3) -- [c1=2] should NOT match
,(2 , 4)
;
WITH musthave (val) AS (VALUES (1), (2))
SELECT distinct c1
FROM ztable zt
WHERE NOT EXISTS ( -- we DONT WANT the records
SELECT * FROM musthave mh
WHERE NOT EXISTS ( -- for which one of the musthaves is missing
SELECT * FROM ztable nx
WHERE nx.c1 = zt.c1
AND nx.c2 = mh.val
)
)
;
-- 对于较小的问题(有限的必须具备的值)你可以这样做:
SELECT distinct c1
FROM ztable zt
WHERE zt.c2 = 1
AND EXISTS (
SELECT *
FROM ztable t2
WHERE t2.c1 = zt.c1
AND t2.c2 = 2
);
-- 还有另一种方法,计算匹配的 c2 值:
SELECT DISTINCT zt.c1
FROM ztable zt
JOIN (
SELECT c1, COUNT(DISTINCT c2) AS cnt
FROM ztable t2
WHERE t2.c2 IN (1, 2)
GROUP BY c1
) zzz ON zzz.c1= zt.c1
WHERE zzz.cnt = 2
;
如果我想检查一列是否等于一个值或其他值,我写:
where col1 in (1, 4, 9);
但是如果我想同时检查一列是否等于这些值, 我应该写:
where col1 = 1 and col1 = 4 and col1 = 9;
SQL 中是否有任何缩写形式,例如 in?
示例:
c1 | c2
-----------
1 | 1
1 | 2
1 | 3
Select 来自表名的 c1,其中 c2 = 1 且 c2 = 2;
在结果集中我想要1
PostgreSQL 已将 <operator> ALL
语法扩展到数组,因此您可以使用:
WHERE col1 = ALL (ARRAY[1, 4, 9])
关系划分:
CREATE TABLE ztable
( c1 integer not NULL
, c2 integer not null
, PRIMARY KEY (c1,c2)
);
INSERT INTO ztable(c1,c2) values
(1 , 1) -- [c1=1] should match
,(1 , 2)
,(1 , 3)
,(2 , 3) -- [c1=2] should NOT match
,(2 , 4)
;
WITH musthave (val) AS (VALUES (1), (2))
SELECT distinct c1
FROM ztable zt
WHERE NOT EXISTS ( -- we DONT WANT the records
SELECT * FROM musthave mh
WHERE NOT EXISTS ( -- for which one of the musthaves is missing
SELECT * FROM ztable nx
WHERE nx.c1 = zt.c1
AND nx.c2 = mh.val
)
)
;
-- 对于较小的问题(有限的必须具备的值)你可以这样做:
SELECT distinct c1
FROM ztable zt
WHERE zt.c2 = 1
AND EXISTS (
SELECT *
FROM ztable t2
WHERE t2.c1 = zt.c1
AND t2.c2 = 2
);
-- 还有另一种方法,计算匹配的 c2 值:
SELECT DISTINCT zt.c1
FROM ztable zt
JOIN (
SELECT c1, COUNT(DISTINCT c2) AS cnt
FROM ztable t2
WHERE t2.c2 IN (1, 2)
GROUP BY c1
) zzz ON zzz.c1= zt.c1
WHERE zzz.cnt = 2
;