目前有一个场景是
条件 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 zww340277220 OP 就类似这样的 select * from table if A then order by a, b c ,d if B then order by b, c, a,d |
2 yinzhili 2022-01-18 16:46:40 +08:00 |
3 zww340277220 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 2022-01-18 17:12:01 +08:00 ![]() select * from table order by CASE WHEN A = 0 THEN a END, b, c, CASE WHEN A = 1 THEN a END, d |
5 Tenlearn 2022-01-18 17:43:43 +08:00 直接代码多好,这实现不了,性能上也不能这么用 |
![]() | 6 shyrock 2022-01-18 18:06:29 +08:00 用 union 把两条语句的结果集合并了。 |
7 zww340277220 OP @RinHoshizora 感谢 |
8 zww340277220 OP @shyrock 谢谢,是两个不同的结果,不能 union 哦 |
9 zww340277220 OP @Tenlearn 就是不能用代码写我才要这样实现的 |
![]() | 10 shyrock 2022-01-18 18:23:17 +08:00 @zww340277220 #8 两个数据集的字段是一样的,一个为空,一个有数据,应该可以 union |
![]() | 11 c6h6benzene 2022-01-18 19:08:15 +08:00 [select A] where :cOndition= A union [select B] where :cOndition= B |
![]() | 12 c6h6benzene 2022-01-18 19:10:22 +08:00 啊,正常的话要 union 之后才能 order by |
![]() | 13 c6h6benzene 2022-01-18 19:14:13 +08:00 查了查 Stackoverflow ,大概可以用 DECODE: https://stackoverflow.com/questions/14597695/conditional-order-by-clause-in-sql |
14 zww340277220 OP @shyrock 数据集一样,数据也全部一样,但是排列顺序不一样,union 后不就有两份数据了嘛?还是不能用 union 的, |
15 zww340277220 OP @c6h6benzene 感谢,大佬提示,再去试试 decode 能不能行。 |
16 yinzhili 2022-01-19 10:06:16 +08:00 @zww340277220 根据外部入参做判断?如果是 mybatis 就有 choose when otherwise 可以用 |
![]() | 17 shyrock 2022-01-19 10:57:33 +08:00 @zww340277220 #14 被你绕晕了,你 A 和 B 两个条件难道不是互斥的?存在 A 和 B 都满足的情况? |
18 zww340277220 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 zww340277220 OP |