V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
zww340277220
V2EX  ›  数据库

请教一个 oracle 的排序问题

  •  
  •   zww340277220 · 2022-01-18 16:17:55 +08:00 · 1357 次点击
    这是一个创建于 1073 天前的主题,其中的信息可能已经有所发展或是发生改变。

    目前有一个场景是

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

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

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

    19 条回复    2022-01-20 09:39:43 +08:00
    zww340277220
        1
    zww340277220  
    OP
       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
        2
    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
        3
    zww340277220  
    OP
       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
        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
    Tenlearn
        5
    Tenlearn  
       2022-01-18 17:43:43 +08:00
    直接代码多好,这实现不了,性能上也不能这么用
    shyrock
        6
    shyrock  
       2022-01-18 18:06:29 +08:00
    用 union 把两条语句的结果集合并了。
    zww340277220
        7
    zww340277220  
    OP
       2022-01-18 18:18:31 +08:00 via iPhone
    @RinHoshizora 感谢
    zww340277220
        8
    zww340277220  
    OP
       2022-01-18 18:19:24 +08:00 via iPhone
    @shyrock 谢谢,是两个不同的结果,不能 union 哦
    zww340277220
        9
    zww340277220  
    OP
       2022-01-18 18:20:01 +08:00 via iPhone
    @Tenlearn 就是不能用代码写我才要这样实现的
    shyrock
        10
    shyrock  
       2022-01-18 18:23:17 +08:00
    @zww340277220 #8 两个数据集的字段是一样的,一个为空,一个有数据,应该可以 union
    c6h6benzene
        11
    c6h6benzene  
       2022-01-18 19:08:15 +08:00
    [select A] where :condition = A union [select B] where :condition = B
    c6h6benzene
        12
    c6h6benzene  
       2022-01-18 19:10:22 +08:00
    啊,正常的话要 union 之后才能 order by😅
    c6h6benzene
        13
    c6h6benzene  
       2022-01-18 19:14:13 +08:00
    zww340277220
        14
    zww340277220  
    OP
       2022-01-19 08:45:29 +08:00
    @shyrock 数据集一样,数据也全部一样,但是排列顺序不一样,union 后不就有两份数据了嘛?还是不能用 union 的,
    zww340277220
        15
    zww340277220  
    OP
       2022-01-19 08:46:07 +08:00
    @c6h6benzene 感谢,大佬提示,再去试试 decode 能不能行。
    yinzhili
        16
    yinzhili  
       2022-01-19 10:06:16 +08:00
    @zww340277220 根据外部入参做判断?如果是 mybatis 就有 choose when otherwise 可以用
    shyrock
        17
    shyrock  
       2022-01-19 10:57:33 +08:00
    @zww340277220 #14 被你绕晕了,你 A 和 B 两个条件难道不是互斥的?存在 A 和 B 都满足的情况?
    zww340277220
        18
    zww340277220  
    OP
       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
        19
    zww340277220  
    OP
       2022-01-20 09:39:43 +08:00
    @yinzhili
    @zww340277220 感谢,确实可以,不过就是感觉怪怪的,别人维护起来可能看不懂什么意思。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2757 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 00:30 · PVG 08:30 · LAX 16:30 · JFK 19:30
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.