【问题标题】:Ordering the records订购记录
【发布时间】:2016-01-20 08:47:29
【问题描述】:

我正在尝试按以下顺序对记录进行排序

1) 特殊字符
2) 只有数字
3) 字母/字母数字

记录

G1
G10
G19
123
87
!@#$
G5
G25
G9

预期输出:

!@#$
87
123
G1
G5
G9
G10
G19
G25

SQL Fiddle

谁能帮忙解决这个问题。

我试过SUBSTRING(name FROM '^(.*?)( \\d+)?$')

【问题讨论】:

  • Postgresql 支持数字排序的排序规则吗?
  • 是的,我猜它支持
  • 如果是这样,请执行ORDER BY Records COLLATE numericcollation 之类的操作。 (您可能需要单独处理特殊字符...)
  • 你是如何定义特殊字符的顺序的? !@#$ 会在 @#!$ 之前出现吗?什么是逻辑。还有数字呢?第一位数字?从最小到最大?字母是 G1、G2、G3 等还是 G1、G12、G23、G3、G45
  • 就此而言,我没有考虑特殊字符的顺序,但如果我们将其与字母/数字/字母数字进行比较,那么特殊字符应该放在首位

标签: sql regex postgresql sql-order-by


【解决方案1】:

您可以使用正则表达式按条件匹配订单

SELECT *
FROM test
ORDER BY substring(NAME FROM '[$&+,:;=?@#|]') -- To get special character
        ,substring(NAME FROM '^[0-9]*$')::INT -- To get only integer from a value(87 and 123)
        ,substring(NAME FROM '[0-9]+')::INT   -- To get integer from a value (10 from G10) 

SQLFIDDLE-Demo

【讨论】:

    猜你喜欢
    • 2013-08-10
    • 1970-01-01
    • 2020-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多