目前有一个场景是
条件 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 2
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 |