使用SQL显示count(*)为零的行

时间:2018-08-01 15:09:40

标签: sql oracle

我需要编写一个查询以显示where条件中存在的所有记录,如果该列没有任何值,则应返回0。

如何在不使用双表的情况下编写此查询?

SELECT city, count(city)
FROM Customers
where City IN ('ABCD','US' )
group by city;

输入

City 

US

输出应为

ABCD  0

US    1

1 个答案:

答案 0 :(得分:3)

您可以使用集合并使用左外部联接代替in()

select t.column_value as city, count(c.city) as city_count
from table(sys.odcivarchar2list('ABCD','US')) t
left join customers c
on c.city = t.column_value
group by t.column_value
order by city;

CITY       CITY_COUNT
---------- ----------
ABCD                0
US                  1

sys.odcivarchar2list是内置的集合类型,在这种情况下,它是使用2或100或要查找的许多值的列表初始化的。

table()是一个表集合表达式,它将列表扩展为单独的行,每个列表值一个。的结果集只有一列,您可以将其称为column_value

然后可以将这些扩展的行保留在您的客户表中,以进行汇总计数。由于存在外部联接,因此列表中客户表中没有匹配项的任何值将报告为零。

或者您可以使用XQuery序列,但是列表很难构建:

select x.city, count(c.city) as city_count
from xmltable('"ABCD","US"' columns city varchar2(10) path '.') x
left join customers c
on c.city = x.city
group by x.city
order by city;

CITY       CITY_COUNT
---------- ----------
ABCD                0
US                  1

如果您传递的是包含逗号分隔值而不是实际值列表的单个字符串,那么这将很有用。