请教一个 oracle 的排序问题

2022-01-18 16:17:55 +08:00
 zww340277220

目前有一个场景是

条件 A 执行 select * from table order by a, b c ,d

条件 B 执行 select * from table order by b, c, a,d

想请问下 oracle 大佬,oracle 数据能不能实现把这两个语句写成一个语句, 网上查了 case when 的功能和我想要的是完全不是一个东西。

1336 次点击
所在节点    数据库
19 条回复
zww340277220
2022-01-18 16:20:42 +08:00
就类似这样的
select * from table
if A then order by a, b c ,d
if B then order by b, c, a,d
yinzhili
2022-01-18 16:46:40 +08:00
是不是要根据表字段值做逻辑判断,类似这样:
select * from table t
order by case when t.id>10000 then t.id else t.name end desc
zww340277220
2022-01-18 16:57:47 +08:00
@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
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
Tenlearn
2022-01-18 17:43:43 +08:00
直接代码多好,这实现不了,性能上也不能这么用
shyrock
2022-01-18 18:06:29 +08:00
用 union 把两条语句的结果集合并了。
zww340277220
2022-01-18 18:18:31 +08:00
@RinHoshizora 感谢
zww340277220
2022-01-18 18:19:24 +08:00
@shyrock 谢谢,是两个不同的结果,不能 union 哦
zww340277220
2022-01-18 18:20:01 +08:00
@Tenlearn 就是不能用代码写我才要这样实现的
shyrock
2022-01-18 18:23:17 +08:00
@zww340277220 #8 两个数据集的字段是一样的,一个为空,一个有数据,应该可以 union
c6h6benzene
2022-01-18 19:08:15 +08:00
[select A] where :condition = A union [select B] where :condition = B
c6h6benzene
2022-01-18 19:10:22 +08:00
啊,正常的话要 union 之后才能 order by😅
c6h6benzene
2022-01-18 19:14:13 +08:00
zww340277220
2022-01-19 08:45:29 +08:00
@shyrock 数据集一样,数据也全部一样,但是排列顺序不一样,union 后不就有两份数据了嘛?还是不能用 union 的,
zww340277220
2022-01-19 08:46:07 +08:00
@c6h6benzene 感谢,大佬提示,再去试试 decode 能不能行。
yinzhili
2022-01-19 10:06:16 +08:00
@zww340277220 根据外部入参做判断?如果是 mybatis 就有 choose when otherwise 可以用
shyrock
2022-01-19 10:57:33 +08:00
@zww340277220 #14 被你绕晕了,你 A 和 B 两个条件难道不是互斥的?存在 A 和 B 都满足的情况?
zww340277220
2022-01-20 09:37:49 +08:00
@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

所以我才会提这个问题的。
zww340277220
2022-01-20 09:39:43 +08:00
@yinzhili
@zww340277220 感谢,确实可以,不过就是感觉怪怪的,别人维护起来可能看不懂什么意思。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/829021

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX