where條件中使用case when來實現不同列的join

lsq_008發表於2012-04-18
1. at_naizan表為奶站表,其中含有該省ID,地區ID,縣市ID。
2. ENFORCE為執法機構表,其中包含了該執法機構的執法範圍,scope欄位,有省級、地級、縣級
3. ENFORCEMAN為執法人員表,該表中包含了該人員所屬的執法機構ID。
現在查詢需求如下:給定一個執法人員,根據該執法人員所屬執法機構的執法範圍和省、地區、縣市ID,查出該執法人員管轄的奶站列表,
執法機構表與奶站表通過地區ID關聯時,如果是省級的,只需要關聯SHENG_ID,如果是地區級的,需要關聯SHENG_ID和DIQU_ID,如果是縣級的,
則需要關聯SHENG_ID、DIQU_ID、XIAN_ID,根據tom大師給出的方法,在where條件中使用case when來實現這個查詢,如下:

SQL> select s.sid
  2            from
  3                     AT_NAIZAN S,
  4                     ENFORCE E,
  5                     ENFORCEMAN EM
  6           WHERE
  7                     case when e.scope='省級' and s.provinceid=e.sheng_id then 1
  8                          when e.scope='地級' and s.provinceid=e.sheng_id and s.areaid=e.diqu_id then 1
  9                          when e.scope='縣級' and s.provinceid=e.sheng_id and s.areaid=e.diqu_id and s.COUNTYID=e.xian_id then 1
 10                          else 0
 11                     end=1
 12                     and em.enforceid=e.eid
 13                      and  em.eid=3;

       SID
----------
        58
        62
        63
        72
        75
        76
        77
        59
        67
        73
        60
        69
        61
        71
        66
        68
        64
        70
        65
        74
      3817

已選擇21行。


case when e.scope='省級' and s.provinceid=e.sheng_id then 1                                                    
     when e.scope='地級' and s.provinceid=e.sheng_id and s.areaid=e.diqu_id then 1                             
     when e.scope='縣級' and s.provinceid=e.sheng_id and s.areaid=e.diqu_id and s.COUNTYID=e.xian_id then 1    
     else 0                                                                                                    
end=1       
以上的case when,可以認為是一個函式,當符合相應的條件時,返回1,否則返回0,最後判斷是否等於1,
從而巧妙的實現了根據不同的scope來進行不同列的join。
當然,用簡單的or也可以實現這個功能:
SQL> select s.sid
  2             from
  3                      AT_NAIZAN S,
  4                      ENFORCE E,
  5                      ENFORCEMAN EM
  6            WHERE
  7                       ((e.scope='省級' and s.provinceid=e.sheng_id)
  8                                        or
  9                        (e.scope='地級' and s.provinceid=e.sheng_id and s.areaid=e.diqu_id )
 10                                        or
 11                        (e.scope='縣級' and s.provinceid=e.sheng_id and s.areaid=e.diqu_id and s.COUNTYID=e.xian_id)
 12                                       )
 13                       and em.enforceid=e.eid
 14                       and  em.eid=3;

       SID
----------
        58
        59
        60
        61
        62
        63
        64
        65
        66
        67
        68
        69
        70
        71
        72
        73
        74
        75
        76
        77
      3817

已選擇21行。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10972173/viewspace-721503/,如需轉載,請註明出處,否則將追究法律責任。

相關文章