sql - PostgreSQL 中的自定义排序(排序依据),与语言环境无关

标签 sql database postgresql

假设我有一个包含两列的简单表格:id (int) 和 name (varchar)。在此表中,我存储了一些波兰语名称,例如:

 1 | sępoleński
 2 | świecki
 3 | toruński
 4 | Włocławek

现在,假设我想按名称对结果进行排序:

SELECT * FROM table ORDER BY name;

如果我有 C 语言环境,我会得到:

 4 | Włocławek
 1 | sępoleński
 3 | toruński
 2 | świecki

这是错误的,因为“ś”应该在“s”之后和“t”之前。如果我使用波兰语语言环境 (pl_PL.UTF-8),我会得到:

 1 | sępoleński
 2 | świecki
 3 | toruński
 4 | Włocławek

这也不是我想要的,因为我希望名称以大写字母开头,就像在 C 语言环境中一样,如下所示:

 4 | Włocławek
 1 | sępoleński
 2 | świecki
 3 | toruński

我该怎么做?

最佳答案

如果您想要自定义排序,您必须定义一些函数以某种方式修改您的值,以便修改后的值的自然排序符合您的要求。

例如,您可以追加一些字符或将值以大写开头的字符串:

 CREATE OR REPLACE FUNCTION mysort(text) returns text IMMUTABLE as $$
   SELECT CASE WHEN substring($1 from 1 for 1) =
   upper( substring($1 from 1 for 1))  then 'AAAA' || $1 else $1 END
   ;
   $$  LANGUAGE SQL;

然后

SELECT * FROM table ORDER BY mysort(name);

这不是傻瓜式的(您可能想将“AAA”更改为更合适的内容),当然会影响性能。

关于sql - PostgreSQL 中的自定义排序(排序依据),与语言环境无关,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4381743/

相关文章:

Mysql 计算每个值的频率并按另一个值分组(二维表)

PHP/MySQL 分页

sql - 解释计划和gather_plan_statistics的区别

sql - 按成分名称查找食谱,并尽可能排序

database - 恢复 PostgreSQL 中的默认权限

mysql - 在 MySQL 中,将每一行中的值设置为同一行上的 DATEDIFF 计算

python - Django ModelMultipleChoiceField 不显示正确的选择名称

mysql - 轮函数中 case 表达式和除法运算符的使用错误

postgresql - pgadmin 中运行的每个查询都失败

java - 如何用JDBC调用PostgreSQL存储过程