如何通过A a-Z z-符号订购

时间:2018-05-24 10:22:37

标签: postgresql sqlalchemy

我想要返回: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

1 个答案:

答案 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知识,我无法检查这个