вы можете играть с порядком заглавных букв, используя сопоставление , например:
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)
против:
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)
конечно, вы можете поиграть с этим правилом заказа самостоятельно, чтобы расширить или изменить его
update Мой предложенный метод не использует методы sqlalchemy.Я полагаю, вам нужно использовать raw sql для его реализации, как я предлагаю.
update2
Как любезно предложено Ильей Эверила, это должноhelp:
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