我有一个出售物品的列表,这些物品是按尺寸命名的,尺寸可以是一个范围.它们的名称通常看起来像810-1410,但也可以有非数字字符97.5in或只是ABC.我试图找到一种简单而有效的方法,在与包含维度的定义表连接时,按这些维度对项目进行排序和显示:

SELECT *
FROM inventory i
    JOIN item_definition def ON i.def_id = def.id
ORDER BY def.dimension ASC 

并得到按维度排序的结果,顺序为8, 10, 10-14, 12, 14-20, 93.5in, ABC而不是10, 10-14, 12, 14-20, 8, 93.5, ABC.

排序中的ABC的顺序并不重要,只要它不会导致错误.我最感兴趣的是如何对8, 10, 10-14, 12, 14-20进行排序.

推荐答案

ICU collation可以配置为按数字而不是字母顺序对数字进行排序.Demo at db<>fiddle

CREATE COLLATION num_ignore_punct (
 provider = icu, 
 deterministic = false, 
 locale = 'und-u-ka-shifted-kn');

create table item_definition
(dimension text collate num_ignore_punct);

insert into item_definition values
(8),(1.5),(1.4),(1),( 10), (0),('10-14'), (12),
('14-20'), ('93.5in'), ('ABC');

select * from item_definition
order by dimension COLLATE num_ignore_punct;
dimension
0
1
1.4
1.5
8
10
10-14
12
14-20
93.5in
ABC
locale = 'und-u-ka-shifted-kn'
  • und-u只是未定义的默认排序规则,将用作您的自定义排序规则的基础.您可以使用不同的值,例如de-AT,这意味着DEutsch(德语)的区域设置为de,AusTrian变体的区域设置为AT
  • ka-shifted使其跳过标点符号和空格(用于解析数字的小数点除外)
  • knkn-true引入了数字排序

Sql相关问答推荐

如何在一个范围内进行分组.""范围值在范围表中定义

具有2个共享列的两个表的Amazon RSQL合并

正在编写查询.我需要将订阅的时间段分为第一个订阅中包含的另一个订阅之前和之后的时间段

如何为该查询编写正确分区依据

PostgreSQL-按距离阈值挤压相邻行的性能

PostgreSQL中递归CTE查询的故障过滤

SQL Select 字母范围没有给我任何东西

基于变量的条件 WHERE 子句

SQL Server - 复杂场景 - 比较状态并填充值到后续行

如何在 postgres 中旋转某些数据字段

COBOL\DB2作业(job)需要帮助?快来获取专业指导!

Oracle函数中无法动态迭代创建的SYS_REFCURSOR

根据是否存在值组合分组并 Select 行

函数调用作为插入值语句中的参数

使用in和and运算符过滤记录的条件

如何 Select 一列具有最小值而另一列具有给定值的记录?

使用SQL中另一个表的查询结果在表中查找记录

SQLite 中的过滤运行总和视图

SQL Server Where 条件

如何在 Oracle 中获取此变量的值?