7

我有一个带有字符串列的表,但它只包含整数(作为字符串)。

当我想在某些查询中按此列排序时,问题就来了。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 部分)的方法。

4

2 回答 2

11

您可以cast像这样在 SQLAlchemy 中执行以下操作:

session.query(...).filter(...).order_by(cast(TableName.string_column_holding_integers, Integer))
于 2016-04-05T02:46:55.553 回答
1

我可以为字母数字提出的最佳方法是:

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  

不完美(理想情况下,100 会在 20 之后......)。我希望社区有一天可以帮助我更好地回答这个问题。

于 2020-04-29T21:14:18.150 回答