如何按字母顺序排序并将结果放在首位?
查询:
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:
我也需要首先对其他非字母字符进行排序。 (例如$ -_#...)
答案 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
子句。