【问题标题】:How to exclude some letter in order by如何按顺序排除某些字母
【发布时间】:2022-01-25 13:24:04
【问题描述】:

我有这些列的表:id,placement 我的位置是输入文本,如下所示:A-L-100、A-L-101、A-R-100、... 当我按位置订购时,它首先给出所有 A-L,然后是 A-R。有没有什么选项可以让 A-Ls 和 A-Rs 按首字母和编号顺序排列?

像这样的 A-L-100、A-R-100

我当前的sql:

SELECT * FROM inventory ORDER BY placement

【问题讨论】:

  • 据我了解,您想按位置订购。 A-L-100, A-R-100, A-L-101 ?
  • 当前数据模式对于整个数据集是否保持不变?
  • @kanils_yes 我想首先拥有所有 A,然后按其编号排序,然后是所有 B,依此类推
  • 但是没有B,逻辑不清楚是否所有数值前都应该有连字符,所有数值都应该以整数结尾
  • @BarbarosÖzhan 我猜他在 DB 中有 B-L-100 之类的东西

标签: sql postgresql


【解决方案1】:

您似乎需要先按数字后缀排序,然后再按字母前缀排序。所以这里使用的是正则表达式。

with inventory(placement) as (values ('A-L-100'), ('A-L-101'), ('A-R-100'))
select * from inventory 
 order by substring(placement from '(\d+)$'), 
          substring(placement from '(^[^\d]+)');

在您的评论之后 - 按前导字母排序,然后按尾随数字。

with inventory(placement) as 
(
 values 
 ('B-L-100'), ('B-L-101'), ('B-R-100'),
 ('A-L-100'), ('A-L-101'), ('A-R-100')
)
select * from inventory 
 order by left(placement, 1), substring(placement from '(\d+)$');

【讨论】:

  • 谢谢,但是这在 A 100 之后给出了 B 100。我想要所有的 A 首先并按其编号排序,然后所有 B 然后按编号排序
  • 只使用了select * from inventory order by left(placement, 1), substring(placement from '(\d+)$'); 并且有效
  • 当然,with 部分是真实的数据模型。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-07-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多