【问题标题】:Return matching SQL results in defined order?按定义的顺序返回匹配的 SQL 结果?
【发布时间】:2018-01-09 19:19:40
【问题描述】:

我有一个请求返回表格结果,其中包含一列上的自定义顺序和辅助 Alpha/数字排序(先按 Alpha 排序,然后按数字排序)。

Example table:

Names                    Codes
21Tail                   F
Aardvark                 A
Lead Sled                D
Meatbox                  D
23AceTail                C
Cee One-Oh-Boom          C
Corsair                  X
Texan                    X
Widow-Maker              X
Convertor                A

output:
    Names(alpha/numeric)       Codes(Custom Sort)
    Aardvark                   A
    Convertor                  A
    Cee One-Oh-Boom            C
    23AceTail                  C
    Corsair                    X
    Texan                      X
    Widow-Maker                X
    Lead Sled                  D
    Meatbox                    D
    21Tail                     F

代码顺序应按A、C、X、D、F排序

更新: 接受的答案,Herehere 帮助我找到了解决方案。

这对我有用:

select *
from Table
ORDER BY CASE WHEN Codes = 'A' Then 0
              WHEN Codes = 'C' Then 1
              WHEN Codes = 'X' Then 2
              WHEN Codes = 'D' Then 3
              WHEN Codes = 'F' Then 4
              Else 5 End,
              CASE WHEN NAMES LIKE '[0-9]%' Then 1 Else 0 END,
              Names

【问题讨论】:

  • 这个答案可能对你有帮助:Jomoos answer
  • 您能用文字解释一下您是如何对这些结果进行排序的吗?我猜你想在自定义排序上进行分组,在名称列上的这些组中排序,并按每个组中的名字进行整体排序?
  • @MartinBackasch 这比尝试对实际上是字符串的数值进行排序更复杂。
  • @juharr 除了我已经拥有的方式之外,我什至无法解释它,但它没有分组..我只需要自定义列的输出按显示的顺序排列:A, C、X、D、F,然后按字母/数字对 Names 列进行二次排序。我正在努力按 A、C、X、D、F 顺序输出。
  • @eaglei22 所以你总是想要 A 然后 C 然后 X D 然后 F,不管相应的名称值是什么?它确实引出了一个问题,即为什么您没有可以自然地按您想要的自定义排序列顺序排序的值。也许如果你只是解释为什么 X 不在最后,那么它会更清楚。

标签: c# mysql sorting


【解决方案1】:

使用我找到的 herehere

select *
from yourTable
order by case when Codes = "A" then 1
              when Codes = "C" then 2
              when Codes = "X" then 3
              when Codes = "D" then 4
              when Codes = "F" then 5
              else 6
         end asc,
         IF(Names RLIKE '^[a-z]', 1, 2), 
         Names

【讨论】:

  • 这不会产生指定的输出。它将“C”行排序为:23AceTail、Corsair。示例要求:Corsair、23AceTail
  • @CaiusJard 有什么问题?
  • '23AceTail' 在示例输出中排在 'Cee One-Oh-Boom' 之后,但不在您的输出中。我认为这是 OP 示例中的错误,因为在 cmets 中他们要求“那个字母,然后按字母/数字对其对应的名称进行排序”
  • @JacobKrall 我很担心这一点。我现在正在测试一个解决方案。
  • 这有点像:ORDER BY CASE WHEN custom_sort = 'C' AND name = 'Cee One-Oh-Boom' THEN .. WHEN custom_sort = 'C' AND name = '23AceTail' THEN ...
【解决方案2】:

尚不清楚您在问题中发布的结果是否已按您的要求排序。您在文本中谈到了排序顺序,但示例与讨论的顺序不一致。

如果您的示例数据已排序,那么(至少在我看来)自定义排序存在一些问题 a) 不按顺序 b) Corsair 和 23AceTail 行未按相同方向排序例如铅雪橇和肉丸行。

假设示例已经排序,自定义排序并没有真正做任何事情或通过它的存在帮助您,因为它不像产品名称那样具体(没有那么细粒度),所以首先对它进行排序没有多大意义如果您使用以下方法:

SELECT * FROM table ORDER BY
  CASE `alpha/numeric`
    WHEN 'Aardvark' THEN 0
    WHEN 'Convertor' THEN 1
    WHEN 'Cee One-Oh-Boom' THEN 2
    WHEN '23AceTail' THEN 3
    WHEN 'Corsair' THEN 4
    WHEN 'Texan' THEN 5
    WHEN 'Widow-Maker' THEN 6
    WHEN 'Lead Sled' THEN 7
    WHEN 'Meatbox' THEN 8
    WHEN '21Tail' THEN 9
  END

如果我做了错误的假设,请告诉我,我会修改

【讨论】:

  • 你不想要CASE "Custom Sort",而不是alpha/numeric吗?
  • 我相信 OP 希望首先在自定义排序列上排序,所需顺序为 A、C、X、D、F,然后在字母/数字列上排序。
  • @juharr 可能,但如前所述,请查看自定义排序 C 中的行顺序,vs X.. C 按字母/数字降序排序,vs X 是字母/数字升序。这变得混乱
  • @JacobKrall 不,因为那不符合规范。尽管 OP 说他想按特定顺序对自定义排序进行排序,然后是名称,他说他想要的内容无法实现发布的示例。所以我们不妨将名称排序为他说的他想要的顺序,绕过自定义排序
  • 我同意:我们需要 @eaglei22 确认他们实际上想要“除 23AceTail 之外的降序字母数字排序,它在 Cee One-Oh-Boom 之后排序”。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-02
  • 2021-11-22
  • 2017-01-24
  • 1970-01-01
相关资源
最近更新 更多