Heroku PostgreSQL в алфавитном порядке, сначала точка - PullRequest
0 голосов
/ 04 марта 2019

Как упорядочить в алфавитном порядке и получить результаты с точкой на первом месте ?

Запрос:

SQL ВЫБРАТЬ имя из статей ЗАКАЗАТЬBY name;

**and the result is:**

GitFlow GithubFlow .gitignore Handover Инкрементные миграции


...but I want to have `.gitignore` first.

**Expected result:**

.gitignore GitFlow GithubFlow Handover Инкрементные миграции





**//update:**

**Correct query is:**
SQL
SELECT name FROM articles ORDER BY name::bytea;

источник: Неправильноsort / collation / order с пробелами в Postgresql 9.4

... но я не знаю почему, не могли бы вы это объяснить?

// edit1:

Мне нужно отсортировать и другие не-буквенные символы в первую очередь.(например, $ -_ # ...)

Ответы [ 2 ]

0 голосов
/ 04 марта 2019

Я ожидаю, что следующее будет соответствовать вашим потребностям лучше всего:

ORDER BY
   NOT starts_with(name, '.'),
   name COLLATE "C"

Сначала будут отсортированы «точечные файлы», потому что FALSE < TRUE, и в этих группах имена сортируются в двоичном порядке (например, заглавные буквы перед строчными).

Мой COLLATE "C" имеет тот же эффект, что и ваш актерский состав, за исключением того, что он дешевле.

Ваш запрос достигает желаемого (в некоторой степени)) потому что значение ASCII для . меньше значения ASCII для всех букв.

Если вы предпочитаете, чтобы имена сортировались в порядке естественного языка (например, albe < Simek), удалите предложение COLLATEв моем ответе.

0 голосов
/ 04 марта 2019

Использование

ORDER BY
  CASE
   WHEN SUBSTRING(name, 1, 1) = '.'
   THEN 1 
   ELSE 2
  END

кажется более «естественным».

Отредактировано

Но мне нужно сначала отсортировать и другие символы.Например, "#, $, _, -" и т. Д.

Тогда вы можете попробовать.

ORDER BY
  CASE
   WHEN
        LOWER(SUBSTRING(name, 1, 1)) NOT BETWEEN 'a' AND 'z'
      AND
        SUBSTRING(name, 1, 1) NOT BETWEEN '0' AND '9'
   THEN 1 
   ELSE 2
  END
...