带条件的MyBatis SELECT查询

时间:2020-06-25 10:18:25

标签: sql mybatis

我有一个这样的表 sample_table

+-------+-------+-------+-------+-------------+
| pkey1 | pkey2 | mode  | type  | type_number |
+-------+-------+-------+-------+-------------+
|   001 |    01 | light | type1 |        1234 |
|   001 |    02 | light | type2 |        2345 |
|   002 |    01 | dark  | type1 |        3456 |
|   002 |    02 | dark  | type2 |        4567 |
+-------+-------+-------+-------+-------------+

我有一个像这样的 MyBatis SELECT查询伪代码

SELECT 
 Master.pkey1,
 Master.pkey2,
 Master.mode,
 Master.type,
 T1.selectedNumber type_number
FROM
( SELECT * from sample_table)
 as Master
left join (select type_number as selectedNumber from sample_table where type='type1') as T1
ON T1.pkey1 = Master.pkey1
left join (select type_number as selectedNumber from sample_table where type='type2') as T2
ON T2.pkey1 = Master.pkey1)

是否有一种方法可以根据模式下的值从T1或T2中进行选择,例如

SELECT 
 Master.pkey1,
 Master.pkey2,
 Master.mode,
 Master.type,
 if Master.type='light'
  T1.selectedNumber type_number
 if Master.type='dark'
  T2.selectedNumber type_number

我的预期结果是这样的

+-------+-------+-------+-------+-------------+
| pkey1 | pkey2 | mode  | type  | type_number |
+-------+-------+-------+-------+-------------+
|   001 |    01 | light | type1 |        1234 |
|   001 |    02 | light | type2 |        1234 |
|   002 |    01 | dark  | type1 |        4567 |
|   002 |    02 | dark  | type2 |        4567 |
+-------+-------+-------+-------+-------------+

编辑:添加了一些额外的代码和预期的结果

1 个答案:

答案 0 :(得分:0)

仅使用窗口功能怎么样?

select s.*,
       (case when mode = 'light'
             then max(case when type = 'type1' then type_number end) over (partition by pkey1)
             else max(case when type = 'type2' then type_number end) over (partition by pkey2)
       end)
from sample_table s;