如果找不到行,SQL返回默认值[PostgreSQL]

时间:2014-11-24 11:00:14

标签: sql return row default default-value

我想知道是否可行(如果可能,在一个查询中),如果缺少行,则查询返回默认值?例如,取这两个表并给出我的查询需要2个参数(place_id和user_id)

T1
place_id / tag_id
1            2
1            3
1            4
2            4
3            2
4            5

T2
user_id / tag_id / count
100         2        1
100         3        20
200         4        30
200         2         2
300         5        22

如您所见,缺少对用户/标签(100,4)。我想归档的是一个查询,它将返回这3个结果

tag_id / count
2           1
3           20
4           0

我知道我可以用这样的东西做到这一点,但它并没有真正匹配最终结果,因为只有事先知道tag_id ......并且显然只返回1行..:< / p>

SELECT T1.tag_id, T2.count 
from T1 t1 
    left join T2 t2 on t1.tagId=t2.tag_id 
where t1.place_id=1 
UNION ALL 
select tag_id,0 
from T1 
where not exist (select 1 from T2 where user_id=100 and tag_id=4) 
  and tag_id=4;

编辑:我的问题没有完整,并且遗失了案件 这是一个例子(curtesy of @a_horse_with_no_name)http://sqlfiddle.com/#!12/67042/4

谢谢!

1 个答案:

答案 0 :(得分:1)

外部联接已经处理了你想要的东西。

由于t1是&#34;左表&#34;对于连接,将返回t1中的所有行。来自&#34;右表&#34;的列(您的示例中为t2)将具有null值。因此,您只需将null转换为0

select t1.tag_id, coalesce(t2.cnt, 0)
from T1 t1 
    left join T2 t2 on t1.tag_Id=t2.tag_id 
and t1.place_id = 1;

SQLFiddle示例:http://sqlfiddle.com/#!12/ed7bf/1


不相关但是:

使用count作为列名是一个非常糟糕的主意,因为它要求您始终用双引号将列名括起来:t2."count"因为它是一个保留字。另外,它并没有真正记录专栏的用途。你应该找到一个更好的名字。