我有一个带有String列的表,但它只包含整数(作为字符串)。
如果我想在特定查询的此列上订购,则会出现问题。 SQLAlchemy(或更具体地说是python)对字符串使用字典顺序,所以
>>> '100000' < '99999'
True
即使
>>> 100000 < 99999
False
如何通过此字符串列的数值来实现order_by?
我目前有一个查询,例如:
session.query(TableName).filter(TableName.column == 'some_value').order_by(TableName.string_column_holding_integers).all()
请注意,将列的类型更改为整数不是一个选项,我需要在当前条件下正确地(通过数值)order_by。
还刚刚发现使用SQL直接在数据库上(这个是MySQL数据库)我无法通过此列正确排序,所以我发现使用CAST(string_column_holding_integers AS unsigned)在这里工作。但是没有找到直接在SQLAlchemy查询上执行此操作(CAST部分)的方法。
答案 0 :(得分:4)
您可以在SQLAlchemy中执行cast
,如下所示:
session.query(...).filter(...).order_by(cast(TableName.string_column_holding_integers, Integer))
答案 1 :(得分:0)
对于字母数字,我能想到的最好方法是:
from sqlalchemy import DECIMAL, cast, func
session.query(...).filter(...).order_by(
func.ascii(TableName.column_name).asc(),
cast(
func.nullif(func.regexp_replace(TableName.column_name, "\\D", "", "g"), ""),
DECIMAL,
).asc(),
)
排序方式如下:
-----+-------------
1
100
2
20
A1
A2
B1
并不完美(理想情况下,20之后为100 ...)。我希望有一天社区能够帮助我更好地回答这个问题。