【问题标题】:How to order by column with two level in SQL?如何在 SQL 中按两级按列排序?
【发布时间】:2021-04-19 08:37:24
【问题描述】:

我需要编写一个 SQL 语句来选择和排序按值和名称的优先级排序的数据。请参阅以下标准。

数据库架构:

    name : string
    isSpecial : boolean
    isA1 : boolean
    isA2 : boolean
    isA3 : boolean

排序优先级(isA1、isA2、isA3的优先级相等,我要从isAx的true数排序)

  • 很特别
  • 3A(所有 isA 都为真)
  • 2A(两个isA为真)
  • 1A(只有一个 isA 为真)
  • 二级排序:姓名

例子

id, name, isSpecial, isA1, isA2, isA3
1, aaa, false, true, true, true
2, bbb, true, true, true, true
3, ccc, false, false, false, true
4, hhh, false, true, false, true
5, ddd, false, true, true, false

预期顺序是

2 (isSpecial = true)
1 (3A)
5 (2A, name = ddd)
4 (2A, name = hhh)
3 (1A)

您有什么想法或建议吗?

更新 请参阅下面评论中的 SQL 语句。

【问题讨论】:

  • 首先,了解您使用的是什么RDBMS; SQL Server 和 Oracle 是 2 个完全不同(且相互竞争)的产品。然后重新标记正确的,并且那个。至于你的问题,这里的ORDER BY 有什么问题?您是否尝试过实施一个?如果不是,为什么不呢?如果有,为什么你的尝试没有成功?您做了什么尝试?
  • @Larnu 感谢您的编辑。我试图创建一个 SQL 语句。请看我上面的更新。
  • name 在您的ORDER BY 中出现 5 次;这没有多大意义。如果您已经通过name 订购,再次订购不会改变排序顺序。
  • 拥有多个包含相同“类型”数据的列以使您以数字后缀结尾(因为您的 isA1、isA2、isA3 列似乎在此处)通常是错误的。它通常表明数据应该在一个具有一列和行的表中建模(这也使得在出现第四个实例时容纳它变得微不足道,而不必再次更改架构)
  • @Damien_The_Unbeliever 谢谢你的建议。数字后缀是例如。

标签: sql select sql-order-by


【解决方案1】:

在 order by 子句中需要三个术语 - isSpecial、“isA”真理的数量和名称。假设您的数据库将 false 和 true 视为 0 和 1,我会这样做:

SELECT   *
FROM     docs
ORDER BY isSpecial DESC,
         isA1 + isA2 + isA3 DESC,
         name ASC

如果您的数据库无法像这样将布尔值隐式转换为整数,则您必须将 isA 列替换为执行此逻辑的 case 表达式,然后再对它们求和。

【讨论】:

  • 非常感谢,它对我有用。我觉得太复杂了。
  • @a_horse_with_no_name 不会是 ors 的链 a 返回 true,如果其中任何一个是 true?看起来你会失去其中一个、两个或三个true 之间的联系,不是吗?
猜你喜欢
  • 2014-01-13
  • 2015-09-01
  • 1970-01-01
  • 2015-07-31
  • 1970-01-01
  • 1970-01-01
  • 2016-01-31
  • 2023-04-08
  • 1970-01-01
相关资源
最近更新 更多