美文网首页
sql case 语法实战

sql case 语法实战

作者: 东阿 | 来源:发表于2019-05-31 14:40 被阅读0次

case 是 ANSI sql 标准语法,其功能很强大,但利用它的人却很少,我们对此感到很惊讶。
-- PostgresSQL 即学即用

如上, case 语法十分强大,但是知道的人却很少。

重点: 我们现在有一张表,阅读记录表,记录了一个文章,被哪些人读过,如何得知,一篇文章的阅读量以及用户自己是否读过。

article_id reader_id
1 张三
1 李四
1 王五
2 张三
2 李四
3 张三
4 张三

最简单的办法,两次查询

select article_id ,count(reader_id) from article_log group by article_id
select article_id  from article_log where reader_id = '李四'

再通过程序内计算,就可以拼出结果了。

但是,如果想通过sql 一次性查出来要怎么做?

  1. 可以利用子查询。
  2. 可以利用 mysql的group concat + locate 。

这两种方法不在本文的讨论范围。

介绍下 case 的用法

select 
article_id ,
count(reader_id) ,
count(case when reader_id='李四' then 1 else NULL end) as ownerRead
from 
article_log group by article_id

注意, else null。这里利用了 count的时候,空值不会算入行数的特性。

如果 使用的是postgresSQL 有更方便的解决方案。

pgsql支持数组类型字段,可以将已读用户已数组形式存在数据库中,如

|:-|-:|
|1|{张三,李四,王五}|
|2|{张三,李四}|
|3|{张三}|
|4|{张三}|

那就更简单了,查询的时候只需要顺便得知数组的长度,再对数组进行包含性检查,检查数组是否包含 李四 ,就可以得到最后结果了。

相关文章

网友评论

      本文标题:sql case 语法实战

      本文链接:https://www.haomeiwen.com/subject/xvwwtctx.html