Sql 如何在ruby中按字符串的整数值排序?

Sql 如何在ruby中按字符串的整数值排序?,sql,ruby-on-rails,ruby,postgresql,ruby-on-rails-5,Sql,Ruby On Rails,Ruby,Postgresql,Ruby On Rails 5,我们使用下面的范围来订购我们的付款,这些付款具有“PAY9994”、“PAY9995”、“PAY9996”等字段“编号” 但我们意识到,在我们的付款号码超过“PAY9999”后,它就不起作用了。如果它是一个纯整数字符串,我本可以使用下面的范围,但前缀“PAY”正在产生问题 scope :order_by_number, ->{order('number::integer DESC')} 任何解决方案?如果前缀始终相同,您可以将其删除: scope :order_by_number, -&

我们使用下面的范围来订购我们的付款,这些付款具有“PAY9994”、“PAY9995”、“PAY9996”等字段“编号”

但我们意识到,在我们的付款号码超过“PAY9999”后,它就不起作用了。如果它是一个纯整数字符串,我本可以使用下面的范围,但前缀“PAY”正在产生问题

scope :order_by_number, ->{order('number::integer DESC')}

任何解决方案?

如果前缀始终相同,您可以将其删除:

scope :order_by_number, ->{ order("trim(leading 'PAY' FROM number)::integer DESC") }

一旦确定这会得到所需的顺序,您可能还需要添加一个与此表达式匹配的基于表达式的索引。这样,PostgreSQL将能够根据该索引对记录进行排序,而不必为每一行运行表达式。请参阅以获取相关帮助。

如果前缀始终相同,则可以将其删除:

scope :order_by_number, ->{ order("trim(leading 'PAY' FROM number)::integer DESC") }

一旦确定这会得到所需的顺序,您可能还需要添加一个与此表达式匹配的基于表达式的索引。这样,PostgreSQL将能够根据该索引对记录进行排序,而不必为每一行运行表达式。有关这方面的帮助,请参阅。

如果您能够,则添加一个新列(带索引)来表示订单编号,并运行一个rake任务来回填这些编号,并对其进行排序,会更有效

否则,您也可以先订购长度,然后订购数量,以确保订购正确

scope :order_by_number, ->{ order('length(number) DESC, number DESC') }

如果您能够,那么添加一个新列(带索引)来表示
订单号
,并运行一个rake任务来倒填数字和订单将更加有效

否则,您也可以先订购长度,然后订购数量,以确保订购正确

scope :order_by_number, ->{ order('length(number) DESC, number DESC') }
检查此项:检查此项: