如果没有找到行,则在sql中返回0

时间:2018-04-02 07:25:24

标签: sql

SELECT count(STATUS) AS STATUS, USER_ID
from Table1
WHERE USER_ID = '65'
group by STATUS, USER_ID
order by STATUS

如果没有找到行,则在sql中返回0

4 个答案:

答案 0 :(得分:1)

如果删除group by,查询将始终返回1行。如果找不到用户,则应返回count(STATUS)等于0的一行:

SELECT  '65'
,       count(STATUS) AS STATUS
FROM    Table1
WHERE   USER_ID = '65'

或者,当用户不在时,您可以使用union来显示0行:

SELECT  USER_ID
,       count(STATUS) AS STATUS
FROM    Table1
WHERE   USER_ID = '65'
GROUP BY
        USER_ID
UNION ALL
SELECT  '65'
,       0
WHERE   NOT EXISTS 
        (
        SELECT  *
        FROM    Table1 
        WHERE   USER_ID = '65'
        )
编辑(来自戈登):

如果您反对让用户ID出现两次,那么只需执行以下操作:

select u.user_id, count(t1.status)
from (select 65 as user_id) u left join
     table1 t1 
     on t1.user_id = u.user_id
group by u.user_id;

答案 1 :(得分:0)

好的,您的限定符是User_Id必须存在。所以只需检查一下。

if Exists(Select * from Table1 where User_Id=65)
SELECT count(STATUS) AS STATUS, USER_ID from Table1 WHERE USER_ID = '65' group by STATUS, USER_ID order by STATUS
else Select 0 as Status, 65 as User_Id

显然在最终代码中使用变量而不是“65”,我假设您实际上想要搜索多行,例如(其中user_id为(xx,xx,xx,xx),否则其他人已指出,顺序是多余的。

另一种方法是从要测试的用户列表中对表进行交叉应用,这将生成用户列表然后计数(再次假设您要实际返回多行)。

答案 2 :(得分:0)

不是那么优雅,也许......但它有效:

{{1}}

我只删除了您的订单,与计数无关

答案 3 :(得分:0)

这通常使用外部联接:选择用户并外部加入状态数据。

顺便说一句,按状态分组并且不在结果中显示列是没有意义的。如果您的结果中有65-4,65-2,65-8,而不知道哪个计数属于哪个状态,结果会告诉您什么?

select count(*), t1.status, u.user_id
from users u
left join table1 t1 on t1.user_id = u.user_id
where u.user_id = 65
group by t1.status, u.user_id
order by t1.status;

最好还有一个状态表,然后是外连接table1,以便获得所有可能的状态及其出现次数,包括零。 (对于多个用户,您首先要与用户交叉加入状态;对于单个用户,您不会,但将user_id = 65放在ON子句中。)< / p>