我想要返回:Aa-Zz-symbol(如:“,1,2,3,+, - )
query.order_by(sqlalchemy.asc(getattr(schema.Study, name)))
它返回:symbol-Aa-Zz
示例:
学习表:
| 16SYB |
| "test" |
| a |
| z |
我想回来:
a
z
"test"
16SYB
但是我的代码返回:
"test"
16SYB
a
z
答案 0 :(得分:2)
您可以使用collation使用大写字母顺序,例如:
t=# with c(v) as (values('16SYB'),('"test"'),('a'),('z'),('A'))
select v from c order by v collate "en_US.utf8";
v
--------
16SYB
a
A
"test"
z
(5 rows)
VS
t=# with c(v) as (values('16SYB'),('"test"'),('a'),('z'),('A'))
select v from c order by v collate "C";
v
--------
"test"
16SYB
A
a
z
(5 rows)
但在你的情况下,它有点复杂:
t=# with c(v) as (values('16SYB'),('"test"'),('a'),('z'),('A'))
select v from c order by case when v ~ '\d' then 9 when v ~ '"' then 8 else 0 end, v collate "en_US.utf8";
v
--------
a
A
z
"test"
16SYB
(5 rows)
当然,您可以自己使用此排序规则进行扩展或更改
<强>更新强> 我提出的方法不使用sqlalchemy方法。我想你需要use raw sql按照我的建议实施它。
<强> UPDATE2 强>
正如IljaEveilä所提出的那样,这应该有所帮助:
col = getattr(schema.Study, name)
query.order_by(case([(col.op('~')(r'\d'), 9),
(col.op('~')('"'), 8)],
else_=0),
col.collate('en_US.utf8'))
对不起我的无知 - 由于完全缺乏sqlalchemy知识,我无法检查这个