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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM