如果`IN`字段不存在,我希望`WHERE IN`返回0

时间:2016-04-20 20:48:35

标签: sql postgresql

考虑查询:

SELECT id, count(id) AS "count"
FROM table
WHERE id IN (
    'value1',
    'value2',
    'value3'
)
GROUP BY id
ORDER BY count ASC;

如果IN中存在table个值中的每一个,那么我会得到一个结果:

RESULTS
-------
value1    <value>
value2    <value>
value3    <value>

但是,如果value2中没有table,那么我会得到

RESULTS
-------
value1    <value>
value3    <value>

请注意结果中value2的缺席情况。

我希望value2显示的值为0

对于上下文,我有一个与订阅ID关联的Rep ID表。我想查询这个以获得具有最少量订阅的Rep。问题是此表中的Rep ID并非详尽无遗。因此,我以编程方式查询包含详细的Rep ID列表的单独数据源。我的想法是以某种方式使用详尽的Rep ID列表创建一个查询,以获得我上面提到的所需响应。

有没有人对此有任何想法?我已经看过类似的帖子,其解决方案是使用COALESCE,但我的子查询返回多个结果,这导致PostgreSQL打嗝。

2 个答案:

答案 0 :(得分:5)

您可以使用values()子句构建一个可以外连接的列表:

SELECT d.id, count(t.id) AS "count"
FROM (
  values 
    ('value1'),
    ('value2'),
    ('value3')
) as data (id)
  left join the_table t on t.id = d.id
GROUP BY d.id
ORDER BY count ASC;

请注意,您必须使用count(t.id)(计算联接表中的值)才能获得0的计数

或者,如果您不想使用from子句混淆values部分,则可以使用公用表表达式:

with data (id) as (
  values 
    ('value1'),
    ('value2'),
    ('value3')
)
SELECT d.id, count(t.id) AS "count"
FROM data d
  left join the_table t on t.id = d.id
GROUP BY d.id
ORDER BY count ASC;

答案 1 :(得分:0)

您可以使用以下查询建立缺失值...测试一下。 希望我能正确理解你的问题。

DROP TABLE TEST2
GO
CREATE TABLE TEST2(ID INT, M1 INT)
GO
INSERT INTO TEST2 VALUES (1,20)
INSERT INTO TEST2 VALUES (2,25)
INSERT INTO TEST2 VALUES (3,30)
GO
SELECT * FROM TEST2 
GO
SELECT CONVERT(INT,B.N) AS NB, A.M1  FROM TEST2 A RIGHT JOIN
(

SELECT TOP (SELECT MAX(ID) FROM TEST2) n = ROW_NUMBER() OVER (ORDER BY number) FROM [master]..spt_values AS A 
 ) B
 ON A.ID = B.n 

GO
DELETE FROM TEST2 WHERE ID =2
GO

SELECT CONVERT(INT,B.N) AS NB, A.M1  FROM TEST2 A RIGHT JOIN
(

SELECT TOP (SELECT MAX(ID) FROM TEST2) n = ROW_NUMBER() OVER (ORDER BY number) FROM [master]..spt_values AS A 
 ) B

 ON A.ID = B.n