Heroku PostgreSQL按字母顺序按点顺序排列

时间:2019-03-04 15:12:57

标签: sql postgresql heroku sql-order-by

如何按字母顺序排序并将结果放在首位

查询:

SQL 从文章中选择名称ORDER BY名称;

**and the result is:**

GitFlow  GithubFlow  .gitignore  交出  增量迁移


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

**Expected result:**

.gitignore  GitFlow  Github流量  交出  增量迁移





**//update:**

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

来源:Incorrect sort/collation/order with spaces in Postgresql 9.4

...但是我不知道为什么,你能解释一下吗?

// edit1:

我也需要首先对其他非字母字符进行排序。 (例如$ -_#...)

2 个答案:

答案 0 :(得分:0)

使用

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

答案 1 :(得分:0)

我希望以下内容能最好地满足您的需求:

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

因为FALSE < TRUE,这将首先对“点文件”进行排序,并且在这些组中,名称按二进制顺序排序(例如,大写字母先于小写字母)。

我的COLLATE "C"与演员表具有相同的效果,但价格更便宜。

由于.的ASCII值小于所有字母的ASCII值,因此您的查询在某种程度上实现了您想要的。

如果您希望按自然语言顺序对名称进行排序(例如albe < Simek),请在我的答案中删除COLLATE子句。