
目前有一个场景是
条件 A 执行 select * from table order by a, b c ,d
条件 B 执行 select * from table order by b, c, a,d
想请问下 oracle 大佬,oracle 数据能不能实现把这两个语句写成一个语句, 网上查了 case when 的功能和我想要的是完全不是一个东西。
1 YoloNaV OP 就类似这样的 select * from table if A then order by a, b c ,d if B then order by b, c, a,d |
2 yinzhili Jan 18, 2022 |
3 YoloNaV OP @yinzhili 这个 case when 满足不了这个功能 其实就是外部有个参数 A 为 1 或者 0 , A 如果是 0 ,则执行 select * from table order by a, b c ,d A 如果是 1 ,则执行 select * from table order by b, c, a,d , 想在是想把这两句 sql 合成一个 sql |
4 RinHoshizora Jan 18, 2022 select * from table order by CASE WHEN A = 0 THEN a END, b, c, CASE WHEN A = 1 THEN a END, d |
5 Tenlearn Jan 18, 2022 直接代码多好,这实现不了,性能上也不能这么用 |
6 shyrock Jan 18, 2022 用 union 把两条语句的结果集合并了。 |
7 YoloNaV OP @RinHoshizora 感谢 |
10 shyrock Jan 18, 2022 @zww340277220 #8 两个数据集的字段是一样的,一个为空,一个有数据,应该可以 union |
11 c6h6benzene Jan 18, 2022 [select A] where :cOndition= A union [select B] where :cOndition= B |
12 c6h6benzene Jan 18, 2022 啊,正常的话要 union 之后才能 order by |
13 c6h6benzene Jan 18, 2022 查了查 Stackoverflow ,大概可以用 DECODE: https://stackoverflow.com/questions/14597695/conditional-order-by-clause-in-sql |
15 YoloNaV OP @c6h6benzene 感谢,大佬提示,再去试试 decode 能不能行。 |
  16 yinzhili Jan 19, 2022 @zww340277220 根据外部入参做判断?如果是 mybatis 就有 choose when otherwise 可以用 |
17 shyrock Jan 19, 2022 @zww340277220 #14 被你绕晕了,你 A 和 B 两个条件难道不是互斥的?存在 A 和 B 都满足的情况? |
18 YoloNaV OP @shyrock 不存在啊,就是两个 order 的排序顺序是不同的,根据外部条件 1 或者 0 来选择哪个排序条件,因为代码中写 sql 语句是用的 oracle 的 C API 接口写的,sql 语句都是写在注释里面,类似这种格式 //{{COMPATIBILITY(KGDB_ORACLE) /* EXEC SQL DECLARE MY_CURSOR CURSOR FOR SELECT * FROM TABLE_NAME ORDER BY A, B, C, D; */ //}}COMPATIBILITY 所以我才会提这个问题的。 |
19 YoloNaV OP |