表中没有的isnull值为0

时间:2015-12-06 00:03:43

标签: mysql sql tsql

TableA包含来自id的53,56,68,70的数据。

我的查询:

select id, count(id) as total from TableA where id in (10,22,43,55,66) group by id

输出:

id       total
55       2
66       5

期望的输出:

id       total
10       0
22       0
43       0
55       2
66       5 

有没有办法可以重写这个查询,并且对于IN语句中不在表中的值,isnull为0?例如,10,22和43不在tableA中但在IN语句中,所以我希望这些值的总和为0

更新:我忘了提到IN语句中的值被传递给客户端应用程序中的数组中的查询。所以价值观总是不同的,所以我不能硬编码任何东西

3 个答案:

答案 0 :(得分:2)

您无法使用in执行此操作。您可以使用left join

执行此操作
select t.id, count(a.id)
from (select 10 as id union all select 22 union all select 43 union all
      select 55 union all select 66
     ) t left join
     tableA a
     on a.id = t.id
group by t.id;

答案 1 :(得分:1)

创建表变量然后使用

DECLARE @Ids TABLE (id int, PRIMARY KEY(id))
INSERT @Ids(id) VALUES (10),(22),(43),(55),(66)

SELECT i.id, ISNULL(COUNT(id),0)
FROM @ids i 
LEFT JOIN TableA ta ON ta.id = i.id
GROUP BY i.id

答案 2 :(得分:0)

如果您的ID在一个合理的范围内,那么您可以创建一个递归调用来构建一个包含所有可能id值的表,而IN子句会将其过滤为只需要的值。然后将该结果集与原始表连接以获得计数:

WITH AllNumbers AS (
    SELECT 0 AS x
    UNION ALL
    SELECT x+1 FROM AllNumbers WHERE x < 100
) 

SELECT an.x, COUNT(id)
FROM 
    TableA ta
    RIGHT JOIN AllNumbers an ON ta.id = an.x
WHERE an.x IN (10,22,43,55,66)
GROUP BY an.x
OPTION (maxrecursion 100)

你可以调整&#39; 100&#39;将值设置为更高的数字,但它会在SQL中创建一个在某个时刻达到限制的调用堆栈。

或者,如果您有一个包含所有可能ID的现有表格,则加入到该表格而不是“AllNumbers&#39;并消除递归。

否则,可能会有一些正则表达式选项将集合转换为行,然后使用上面的相同连接语句。

相关问题