Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如果'IN'字段不存在,我希望'WHERE IN'返回0_Sql_Postgresql - Fatal编程技术网

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

Sql 如果'IN'字段不存在,我希望'WHERE IN'返回0,sql,postgresql,Sql,Postgresql,考虑以下问题: SELECT id, count(id) AS "count" FROM table WHERE id IN ( 'value1', 'value2', 'value3' ) GROUP BY id ORDER BY count ASC; 如果中的每个值都出现在表中,那么我会得到这样一个结果: RESULTS ------- value1 <value> value2 <value> value3 <val

考虑以下问题:

SELECT id, count(id) AS "count"
FROM table
WHERE id IN (
    'value1',
    'value2',
    'value3'
)
GROUP BY id
ORDER BY count ASC;
如果中的每个
值都出现在
表中
,那么我会得到这样一个结果:

RESULTS
-------
value1    <value>
value2    <value>
value3    <value>
请注意结果中没有显示
value2

我希望显示值为
0的
value2

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


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

您可以建立一个列表,您可以使用
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;
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;
请注意,必须使用
count(t.id)
(联接表中的计数值)来获取0的计数

或者,如果不想将
from
部分与
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;
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;

您可以使用下面的查询建立缺少的值…测试它。 希望我能正确理解你的问题

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 

最简单的方法是将您的详尽列表与另一个表放在同一个数据库中,然后它只是一个左连接。我不能在同一个查询中创建一个临时表吗?将
或类似性质的东西一起使用?您还可以构建类似于
的列表,其中t(id)为(选择'value1'联合所有选择'value2'联合所有选择'value3')
当它!这是我的第一次尝试,但我忘记了将所有
联合起来,所以它们显示为列。谢谢你的更新,非常有用!你是个巫师吗?!谢谢,这正是我想要的。
values
语句对我来说是新的;我一直试图使用
with
子句,但忽略了为值指定列名,并且没有使用
values
语句。另外,我更喜欢第二种解决方案,只是对我来说读起来更干净。在使用其中一种解决方案与另一种解决方案时,您知道有什么需要注意的吗?@lilitutos27:两种解决方案在性能上都是相同的。我也更喜欢带有CTE的版本,因为实际的查询不会被
子句弄得乱七八糟。@lilttitus27如果他帮助你,不要忘记接受一个没有名字的回答:)这对Postgres无效