• Mysql实现oracle decode()函数


    今天业务上有个需求,mysql按组group_by获取数据,但过滤掉组中某字段包含某值的那些组(如status=1)

    数据描述需求

    字段    id  name      status

        1    aaa    0

        2    aaa    0

        3    bbb    0

        4    bbb    1

        5    bbb    3

        6    ccc    0

        7    ccc    3

    按组分,可得aaa,bbb,ccc这三组数据,但由于bbb组中有包含status=1的数据,需求不能获取bbb组,要求一条sql查出status不包含=1的组name:aaa,ccc

    大概查了下,oracle中有强大的decode()函数实现这种需求,这里就肤浅说下自己的理解,decode(p1,p2,p3,p4)函数有四个或更多个参数(详见文档),这四个参数可以为表达式或字段,

      意思是:p1的结果1,与p2的结果2比较,if(结果1=结果2),则decode()函数返回p3,else函数返回p4

    oracle简单例子:

      select decode(字段status,1,99,0) from dual;--当字段status的值为1时,decode结果为99,否则为0

    按开头说的需求,我们可以在需要过滤的字段上加上decode函数,然后将所有值过滤为0/非0,再group by下,having sum()这个decode结果判断和是否为0或非0,是非0说明包含,是0说明不包含

    但是mysql没有decode()函数,但是的但是,却可以用if()函数来替代,效果更好更直观:

      if(p1>p2,p3,p4),意思就是当p1大于p2,if函数返回p3,否则返回p4

    变通下,开头需求可以实现:

      select name from t_table group by name having sum(if(status=1),1,0)=0;

    结果集为:aaa,ccc

  • 相关阅读:
    【sqlite】3.ADO.NET实体数据模型增删改查
    【sqlite】1.Vs2019 ado.net实体模型安装教程
    【sqlite】2.Nuget下载好Sqlite.EF6后出现运行报错处理办法
    WPF-数据绑定:日期时间格式
    Entity Framework Database.SetInitializer的几种参数
    收藏
    Sql时间函数
    SQL中的循环、for循环、游标
    C# DateTime 时间格式
    js setInterval()函数 [倒计时用]
  • 原文地址:https://www.cnblogs.com/huangzhen/p/2752379.html
Copyright © 2020-2023  润新知