2014-10-30 2 views
0

У меня есть стол с колонкой priority_n. Притворись, что в этой таблице есть 5 предметов. Два с nil как priority_n, а остальные три имеют 1, 2, 3.Сортировка по двум столбцам с условными обозначениями?

Я хотел бы сделать where(priority_n: nil).order(published_at: :desc) в сочетании с where.not(priority_n: nil).order(priority_n: :asc). Я хочу, чтобы nil в начале активных отношений записи, а затем приоритетные после них. Есть ли способ сделать это?

Если бы я мог понять, как это сделать в SQL, тогда я мог бы сделать это в рельсах.

ответ

1

Ниже приводится статья в стандарте SQL order by: Высказывания

order by (case when priority_n is null then 0 else 1 end), 
     priority_n asc 
0

Дело не эффективно использовать индексы.

ORDER BY priority_N IS NULL DESC, priorit_n ASC 
0

В PostgreSQL, сортировка аннулирует первый/последний мертв просто с NULLS FIRST | LAST (стандарт SQL!):

ORDER BY priority_n NULLS FIRST, published_at 

Второй ORDER BY вещь, потому что кажется, что вы хотите заказать строки с тот же priority_n согласно published_at.

MySQL не реализует NULLS FIRST | LAST. Заменить на:

ORDER BY priority_n IS NOT NULL, priority_n, published_at 

Будет работать и в Postgres.
priority_n IS NOT NULL - булево выражение, которое вычисляется как FALSE (0) или TRUE (1). 0 сортирует перед 1 (и оба перед NULL, но не релевантный здесь.), Поэтому строки с priority_n IS NULL на первом месте.

Смежные вопросы