admin

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

sql

考虑一下查询:

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表。我想查询这个以获取最少订阅数的销售代表。问题在于此表中的代表ID并不详尽。因此,我以编程方式查询了一个单独的数据源,其中包含Rep
ID的详尽列表。我的想法是使用该Rep ID的详尽列表创建查询,以获取我上面提到的所需响应。

有人对此有任何想法吗?我曾在解决方案的使用位置看到过类似的帖子COALESCE,但是我的子查询返回了多个结果,这导致PostgreSQL崩溃。


阅读 234

收藏
2021-07-01

共1个答案

admin

您可以建立一个列表,您可以使用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

另外,如果您不想fromvalues子句弄乱部分,则可以使用公用表表达式:

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;
2021-07-01