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

如何使用ORDER BY按多个排序条件排序

法浩壤
2023-03-14

我想写一个查询,它将根据多个条件对结果进行排序。

请参考下表

我想在表上方排序

1-通过已知域yahoo后跟gmail然后Rest。

所以我想把结果行分成三部分。

第一部分的行具有yahoo作为域,然后在第二部分的行中,最后剩下的行具有gmail域。

2-按字母顺序排列,所有特殊字符位于末尾。

每个部分都应该在name字段上按字母顺序进一步排序,末尾有特殊字符。

结果应如下表所示。

我已经用下面的查询按字母顺序对结果进行排序,底部有特殊符号,但我无法获得正确排序的第一部分,即按已知域排序。

SELECT * FROM table1
ORDER BY
    CASE WHEN name GLOB '[A-Za-z]*'
          THEN name
          ELSE '~' || name
          END COLLATE NOCASE

共有3个答案

宁修永
2023-03-14

可能不是最有效的解决方案,但在这种特殊情况下,它应该与工会合作:

(
  SELECT
    *
  FROM
    table1
  WHERE
    domain like 'yahoo'
  ORDER BY
    name desc
)
UNION
  (
    SELECT
      *
    FROM
      table1
    WHERE
      domain like 'gmail'
    ORDER BY
      name desc
  )
UNION
  (
    SELECT
      *
    FROM
      table1
    WHERE
      domain not like 'yahoo'
      OR domain not like 'gmail'
    ORDER BY
      domain desc,
      name desc
  )

文国发
2023-03-14

第1部分-要首先按特定值排序,可以执行以下操作

SELECT * FROM table1
ORDER BY CASE 
           WHEN domain = 'yahoo' then 0 
           WHEN domain = 'gmail' then 1
           ELSE 2
         END ASC   

第2部分-然后在其中,您希望按名称排序,因此将您现有的名称排序添加到我们的ORDER by中,这样我们就有了:

SELECT * FROM table1
ORDER BY CASE 
           WHEN domain = 'yahoo' then 0 
           WHEN domain = 'gmail' then 1
           ELSE 2
         END ASC,
 CASE WHEN name GLOB '[A-Za-z]*'
          THEN name
          ELSE '~' || name
          END COLLATE NOCASE  
孙阳舒
2023-03-14

在ORDER BY子句中使用布尔表达式:

SELECT * FROM table1
ORDER BY domain = 'yahoo' DESC,
         domain = 'gmail' DESC,
         name GLOB '[A-Za-z]*' DESC,
         LTRIM(LTRIM(name, '.'), '_');

这些布尔表达式中的每一个都计算为1表示true0表示false

请参见演示

 类似资料:
  • 问题内容: 我有一个列表,其中每个元素都是形式。例如,列表的元素可能看起来像这样。 我想通过以下条件对包含描述的元素类型的列表进行排序: 如果两个元素的整数列表(即)的长度不同,则整数列表较小的元素是较小的元素。 否则,如果整数列表的长度相同,则较小的元素是第一个整数的较小整数,这两个元素的整数列表都不同。例如: [[1,1,99,100],-1] <[[1,1,100,1],-1],因为99 <

  • 问题内容: 我有一个包含Quote对象的数组列表。我希望能够按名称,更改和更改百分比的字母顺序进行排序。如何排序我的数组列表? 问题答案: 创建一个合适的对象,它将根据你所需的条件比较两个项目。然后在你的上使用 。 如果以后要按其他条件排序,请使用不同的再次调用。

  • 我想这样做: 我在想有没有更干净的方法来写这种东西。我期待一些东西像签名,它需要一个可比变量并选择第一个非零。

  • 我有以下代码: 我的问题是我想让我的列表按多个东西排序: 1。)将它们分组为未来事件和过去事件(通过检查ystem.current毫秒()是否大于结束时间戳)2。)通过开始升序排序未来事件3。)通过结束降序排序过去事件 我可以用Java 8 Lambda来做这件事吗?或者我需要另一种排序项目的方法吗?

  • 我用的是拉威尔的背包,积垢舱。 如何将orderby()用于多列? 例子: 我看到src和orderby只接受一个参数。 有什么建议吗?

  • 问题内容: 我有一个成员数组/切片: 我的问题是如何按,然后按。 问题答案: 使用sort.Slice(从Go 1.8开始可用)或sort.Sort函数对值的切片进行排序。 通过这两个功能,应用程序提供了一个功能,用于测试一个切片元素是否小于另一个切片元素。要按姓氏和名字排序,请比较姓氏和名字: less函数是使用带有sort.Slice的匿名函数指定的: less函数通过带有sort.Sort函