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无效