Как я могу заказать по символу A aZ z? - PullRequest
0 голосов
/ 24 мая 2018

Я хочу вернуть: Aa-Zz-символ (например: ", 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 голосов
/ 24 мая 2018

вы можете играть с порядком заглавных букв, используя сопоставление , например:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...