当前位置: 首页 > 知识库问答 >
问题:

按顺序使用“case”(MySQL)

祁宝
2023-03-14

我在一个返回一个巨大选择的过程中工作,我不想定义它是如何排序的。我不想从三个字段中选择一个,如果它是升序还是降序,如果三个选项都没有定义,它会默认返回降序中的第一个字段

这边

ORDER BY 
CASE option1 
    WHEN 0 THEN                 
        CASE option2 
            WHEN 0 THEN firstField DESC
            WHEN 1 THEN firstField ASC
        END 
    WHEN 1 THEN             
        CASE option2 
            WHEN 0 THEN secondField DESC
            WHEN 1 THEN secondField ASC
        END 
    WHEN 2 THEN             
        CASE option2 
            WHEN 0 THEN thirdField DESC
            WHEN 1 THEN thirdField ASC
        END                 
    ELSE 
        firstField DESC
    END 
END;

当然,这不起作用... mysql指责单词DESC和ASC中的错误,我怎么能让这个工作??

共有1个答案

归俊
2023-03-14

为了做到这一点,您必须将DESC/ASC移动到大小写之外,因为它们位于表达式之后。

您还应该分离字段。在CASE语句中,如果字段具有不同的数据类型,它们将被转换为适合所有人的数据类型(通常是VARCHAR),这可能会扰乱排序。

你可以这样做:

ORDER BY CASE WHEN option1=0 AND option2=0 THEN firstField END DESC, 
         CASE WHEN option1=0 AND option2=1 THEN firstField END ASC, 
         CASE WHEN option1=1 AND option2=0 THEN secondField END DESC,
         CASE WHEN option1=1 AND option2=1 THEN secondField END ASC,
         CASE WHEN option1=2 AND option2=0 THEN thirdField END DESC,
         CASE WHEN option1=2 AND option2=1 THEN thirdField END ASC,
         firstField DESC 

当不适用时,每种情况都会为所有行返回NULL,因此具有相同的值。事实上,第一种情况是不必要的,因为默认情况下它会被捕获,但为了清晰起见,我将其包括在内。然而,这可能会导致订购过程非常昂贵!

我认为我更愿意动态地构建SQL,并使用一个允许的排序值数组来保证它的安全性。

 类似资料:
  • 我有一个object的数组,我希望循环访问该数组并为每个元素调用服务,但对于每个元素,我希望只有当当前调用成功时才调用下一个元素,除非阻塞其余的。 有没有在序列模式下调用可观察到的数据而不是并行的?

  • 问题内容: 我在mysql排序中寻找一些调整,我通常从表中选择记录,然后按Name(varchar)ASC排序记录, 但编号始终是第一位的 这是我的问题的一些示例( 注意。mysql首先用0-9排序记录 ) 我想要的是字母顺序,然后是数字 所需的输出 问题答案: 使用以下子句:

  • 问题内容: 在Python 3中,使用多个键按字典顺序对对象列表进行排序非常容易。例如: 该参数使您可以指定是升序还是降序。但是,如果要按多个键进行排序,但是要对第一个键使用降序排序,而对第二个键使用升序排序,该怎么办? 例如,假设我们有一个具有两个属性的对象,而,其中an和is是。我们希望通过梳理这些对象的名单在 递减 顺序(使之与点的数量最多的对象是第一位的),但与同等数量的对象,我们要排序这

  • 比如说,我有一张这样的桌子: 我想按列的升序排序,但在此范围内,我想按列的降序排序,如下所示: 我曾尝试使用orderBy(“A”,desc(“B”),但它给出了一个错误。 我应该如何在Spark 2.0中使用dataframe编写查询?

  • 我正在开发一些关于guvnor插件的规则。e、 g.检查 这个人就是老师。 老师是男性。 男教师为45岁或以上。 我把这三条规则分开处理。但现在我想按顺序调用它们。 比如这个人是老师。插入新的事实男性教师。然后在下一个规则中,在收到的事实中填充教师的年龄。然后检查教师的年龄。 那么我如何在drools-guvnor插件中实现这一点。 我在drools-guvnor5.5插件jboss中使用引导编辑

  • 问题内容: 在promise库 Q中 ,您可以执行以下操作以顺序链接promise: 但是,以下命令不适用于 $ q : 问题答案: 只需使用$ q.when()函数: 注意:foo必须是工厂,例如