【问题标题】:SQL Order by using the values from two different columns使用来自两个不同列的值进行 SQL 排序
【发布时间】:2012-05-01 12:09:57
【问题描述】:

假设我有一个包含列 PART_TYPE 和 VALUE 的表 NAME。每种类型都可以有多种类型,例如 FAMILY、GIVEN、PREFIX 等。

我想做的是编写 SQL 来获取所有名称,但首先按特定类型对它们进行排序,然后在该类型中按字母顺序排序。

我有这样的事情:

SELECT *
FROM name
ORDER BY (
  CASE
    WHEN PART_TYPE = 'GIV'
    THEN VALUE
  END)

但我不确定如何将其他类型包含为主要订单,同时将 VALUE 保留为次要订单。添加另一个 case 语句只会使 VALUE 成为主要订单。

我想保持这个数据库独立,但如果需要,我愿意让它特定于 Oracle。

我该怎么做?此外,我们也非常感谢使用 Hibernate Criteria 执行此操作的方法。

编辑:我需要按我定义的特定顺序对 PART_TYPE 进行排序。特别是,它需要先给予,然后是家庭。

所以它应该是这样的:

GIVEN  A
GIVEN  B
GIVEN  C
FAMILY A
FAMILY B

自然顺序是 FAMILY 优先,而不是 GIVEN。

【问题讨论】:

  • ORDER BY TYPE, VALUE ?
  • @zerkms 如何确保类型是由 GIVEN 然后 FAMILY 排序的?
  • 这是一个与这个问题类似的问题:stackoverflow.com/questions/10350330/…
  • 感谢您的回答。我正在坚持看看是否有人有这个的休眠标准版本。如果几个小时后没有出现,我仍然会接受答案。
  • ORDER BY part_type DESC, value?

标签: java sql oracle hibernate sql-order-by


【解决方案1】:

解决此问题的最易于管理的方法可能是创建一个包含所有类型的表,然后在其中设置一个排序列。所以你可能有一个像这样的表:

TypeID      Name      SortOrder
1           FAMILY    2
2           GIVEN     1
3           PREFIX    3

然后您可以将其加入您的查询并使用:

ORDER BY SortOrder, Value

你可以用 CASE 表达式解决这个问题

ORDER BY CASE Type
            WHEN 'GIVEN' THEN 1
            WHEN 'FAMILY' THEN 2
            WHEN 'PREFIX' THEN 3
            END,
            Value

但是你拥有的类型越多,case 表达式就越难管理。

【讨论】:

  • 幸运的是,我只需要担心两种类型,而且应该非常一致。
【解决方案2】:
ORDER BY CASE TYPE
             WHEN 'GIVEN' THEN 0   
             WHEN 'FAMILY' THEN 1
             ELSE 2
         END,
         VALUE

【讨论】:

    【解决方案3】:
    SELECT *
    FROM name
    ORDER BY 
      CASE 
            WHEN TYPE = 'GIVEN' THEN 1
            WHEN TYPE = 'FAMILY' THEN 2
            ELSE 3
         END,
      VALUE
    

    这将按 TYPE 和 VALUE 上的自定义顺序对结果进行排序,作为辅助顺序。

    【讨论】:

    • 但我需要将类型按特定顺序排列,而不是按默认顺序排列。所以,我需要先按 GIVEN 排序,然后按 FAMILy。
    【解决方案4】:

    感觉有点“hacky”,但确实有效

    SELECT part_type,name
    FROM (
    SELECT 
    CASE 
    WHEN part_type = 'Given' THEN 'A'
    WHEN part_type = 'Family' THEN 'B'
    END AS Sorthack,
    part_type,
    name
    FROM NAME
    ) Sort
    
    ORDER BY sorthack,name
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-01-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-10
      • 2020-06-18
      • 2019-12-22
      • 1970-01-01
      相关资源
      最近更新 更多