我们可以通过使用名称来避免关于排序方法的混淆:
- 标准 SQL `select * from t order by f(x)` 语句的“分数函数”。
- Python 的排序数组方法中的“比较函数”(问题文本中称为“排序函数”)。
PostgreSQL 的 `ORDER BY` 子句有三种机制进行排序:
- 标准排序,使用“分数函数”,也可以与索引一起使用。
- 特殊“标准字符串比较替代方案”,根据配置的排序规则进行排序(仅适用于 `text`、`varchar` 等数据类型)。
- `ORDER BY ... USING` 子句。参见此问题或官方文档示例。例如:`SELECT * FROM mytable ORDER BY somecol USING ~<~`,其中 `~<~` 是一个运算符,它嵌入了一个“比较函数”。
在关系型数据库管理系统中,“标准方式”可能不像 Python 的标准方式那样,因为索引是关系型数据库管理系统的目的,而使用分数函数进行索引更加容易。
回答该问题:
- 直接解决方案。没有直接的方法使用用户定义函数作为“比较函数”,就像 Python 或 JavaScript 等语言中的“sort 方法”一样。
- 间接解决方案。您可以在一个“用户定义的操作符”中使用一个“用户定义的比较函数”,并使用一个“用户定义的操作符类”对其进行索引。参见 PostgreSQL 文档:
- 使用“比较函数”的 `CREATE OPERATOR`;
- 可以进行索引的 `CREATE OPERATOR CLASS`。
解释“比较函数”:
在 Python 中,比较函数如下所示:
def compare(a, b):
return 1 if a > b else 0 if a == b else -1
比较函数比
分数函数使用更少的CPU。同时,当
分数函数未知时,它也有助于表达顺序。
详见:
其他典型的比较函数
维基百科的例子用于比较元组:
function tupleCompare((lefta, leftb, leftc), (righta, rightb, rightc))
if lefta ≠ righta
return compare(lefta, righta)
else if leftb ≠ rightb
return compare(leftb, rightb)
else
return compare(leftc, rightc)
在 JavaScript 中:
function compare(a, b) {
if (a is less than b by some ordering criterion) {
return -1;
}
if (a is greater than b by the ordering criterion) {
return 1;
}
return 0;
}
以下是PostgreSQL文档中的C++示例:
complex_abs_cmp_internal(Complex *a, Complex *b)
{
double amag = Mag(a),
bmag = Mag(b);
if (amag < bmag)
return -1;
if (amag > bmag)
return 1;
return 0;
}