我正在运行CentOS 6.5,PostgreSQL 8.4.18和Django 1.6。
我无法为Postgres数据库(Lc_collate和Lc_ctype)找到正确的排序规则设置,以实现我想要的排序顺序。
该网站的语言为en_US。
编码是UTF8。
我希望SQL查询对忽略大小写进行排序,并在列表顶部添加符号。
因此,如果我有一个名为“ListingType”的Django模型,那么当我这样做时:
ListingType.objects.all()
我希望这是订购
*This has a Symbol
Aardvark
baby
Bat
cat
Dance
This doesn't have a symbol
我有时可以让*在顶部排序,但这会导致所有小写项目在列表的底部排序。 当我实现忽略大小写并且小写项目位于列表中间的预期时,*在中间进行排序以及是否忽略符号的存在(而不是将其跳到顶部)。 / p>
是否有人知道在创建数据库时使用哪些设置来考虑符号并且不区分大小写以实现上面列出的所需顺序?
编辑:
当使用utf8_general_ci排序规则时,此排序顺序在MySQL中运行良好。
答案 0 :(得分:0)
您可以使用PostgreSQL string functions来帮助您获得所需的订单。
例如:
SELECT name FROM city
ORDER BY
LENGTH(REGEXP_REPLACE(SUBSTR(name, 1, 1), '([a-zA-Z]+)', '')) DESC,
LOWER(name) DESC;
第一个子句获取字符串的第一个字符,如果字符是字母,则将其替换为''
。然后我们可以对这个新字符串的长度是0
还是1
进行排序(如果是非字母的话,它是1
。
如果您的数据与ASCII不兼容,则应使用''
(使用REGEXP_REPLACE
功能)替换指定的一组“特殊字符”,并将排序切换为升序。
第二个子句确保结果的其余部分以不区分大小写的方式排序。