Postgresql ORDER BY空格
假设我有一个包含一列的表,即:
5 absolute 5.0 5.1 last 50 5 elite edge
我需要订购它(使用postgresql方法):
5 absolute 5 elite 5.0 5.1 50 edge last
但如果我使用经典的“ORDER BY列ASC”,我得到:
50 5.0 5.1 5 absolute 5 elite edge last
有很多工具,如substring或using,但我无法理解它们是如何工作的。
我需要做什么?
不知道,可能是这样的:
with cte as ( select col1, regexp_split_to_array(col1, ' ') as d from Table1 ) select col1 from cte order by d[1] ~ '^([0-9]+[.]?[0-9]*|[.][0-9]+)$' desc, case when d[1] ~ '^([0-9]+[.]?[0-9]*|[.][0-9]+)$' then d[1]::numeric end, d[2]
sql小提琴演示
这个将字符串按空格分割为数组,将第一个条目转换为数字,并按此数字和剩余字符串对结果进行排序
这应该这样做:
order by regexp_replace(the_column, '[^0-9\.]', '', 'g')::numeric DESC
它从值中删除所有非数字字符(仅保留数字和.
),然后将其转换为数字。 然后使用该数字对降序进行排序
唯一的事情是5.0将在5.1之后按上述顺序排序。
如果您需要考虑没有任何数字的值,请执行以下操作:
order by case when regexp_replace(the_column, '[^0-9\.]', '', 'g') <> then regexp_replace(the_column, '[^0-9\.]', '', 'g')::numeric end DESC NULLS LAST, the_column DESC -- to sort the "NULL" values alphabetically
如果你不想重复正则表达式,你可以这样做:
with clean_data as ( select the_column, regexp_replace(the_column, '[^0-9\.]', '', 'g') as clean_column, .... from ... ) select * from clean_data order by case when clean_column <> '' then clean_column::numeric end desc nulls last, the_column desc;
- PGError:错误:对象的AR查询及其has_many对象的WHERE子句中不允许聚合
- 使用Ruby on Rails在PostgreSQL中使用interval
- 在Heroku,Cedar,与Unicorn:获取ActiveRecord :: StatementInvalid:PGError:SSL SYSCALL错误:检测到EOF
- 无法使用gem“pg”从我的Ruby脚本连接到Postgres(pg)数据库(这不是rails,只是纯粹的ruby)
- 将字符串化数组转换回数组
- 存储星期几和时间?
- 从ActiveRecord原始SQL获取类型化结果
- ActiveRecord在Heroku上错误地加载二进制字段,在OSX上很好
- Rails 4自定义404导致Heroku上的postgresql连接失败