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

lil*_*s27 2 sql postgresql

考虑查询:

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

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

RESULTS
-------
value1    <value>
value2    <value>
value3    <value>
Run Code Online (Sandbox Code Playgroud)

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

RESULTS
-------
value1    <value>
value3    <value>
Run Code Online (Sandbox Code Playgroud)

注意value2结果中没有.

我希望value2显示的值为0.

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

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

a_h*_*ame 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;
Run Code Online (Sandbox Code Playgroud)

请注意,必须使用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;
Run Code Online (Sandbox Code Playgroud)