美文网首页
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