where條件中使用case when來實現不同列的join
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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- left join,right join,inner join的條件on和where的區別
- mysql中case when的使用MySql
- SQL中的CASE WHEN使用SQL
- PLSQL條件(CASE WHEN)語句小應用SQL
- Oracle 條件索引 case when 報錯解決方案Oracle索引
- SQLServer使用case when中的order bySQLServer
- SQL中on條件與where條件的區別[轉]SQL
- ORACLE SQL開發where子句之case-whenOracleSQL
- mysql case when then 使用MySql
- T-SQL——關於Join on的的連線條件和where的篩選條件的區分SQL
- mysql中的case when 與if()MySql
- ORACLE CASE WHEN 及 SELECT CASE WHEN的用法Oracle
- switch拼接where條件
- sql中case when的小學SQL
- 案例:oracle中case when的用法Oracle
- SQL Case when 的使用方法SQL
- Excel不同列多條件計數Excel
- Oracle中left join中右表的限制條件Oracle
- 關於在SQL語句中ON和WHERE中條件使用的差異SQL
- SQL中的case when then else end用法SQL
- 【專案實戰】---SQLServer中case when的簡單用法SQLServer
- Percona MySQL 5.6 WHERE 條件中 OR 的索引測試MySql索引
- mysql where條件中 字串右邊的空格會忽略MySql字串
- Oracle Case WhenOracle
- SQL Case WhenSQL
- 替代SQL語句WHERE條件中OR關鍵詞SQL
- Oracle的order by case whenOracle
- 【開發篇sql】 條件和表示式(七) decode,case when,connect by 語句SQL
- MySQL 的CASE WHEN 語句使用說明MySql
- Oracle中where子句中條件的物理執行順序Oracle
- SQL join中on與where區別SQL
- mysql 左連結 left join 條件寫在where 後面與 on後面的區別MySql
- Django筆記二十三之case、when操作條件表示式搜尋、更新等操作Django筆記
- 使用條件型別實現TypeScript中的函式過載型別TypeScript函式
- model 的 with 怎麼寫 join 的條件
- MySQL核心技術之“WHERE條件”MySql
- 使用KubernetesIngress來實現類似Istio條件路由路由
- [程式碼結構設計]根據不同條件使用不同實現類的業務程式碼設計