我正在研究 sqlite-hashes - 将
md5
和 sha256
等哈希函数添加到 SQLite。
为了创建
sha256_concat(val)
- 序列上的哈希,每个值必须保持一致的顺序。 SQLite 不保证常规聚合函数的执行顺序,即使它们在查询中具有 ORDER BY
,因此这两个示例中的结果都未定义! 🤦(参见group_concat订购问题):
SELECT sha256_concat(val) FROM tbl ORDER BY val;
SELECT sha256_concat(val) FROM (SELECT val FROM tbl ORDER BY val));
我认为我可以使用自定义窗口函数来解决它,但它也有一些限制:聚合状态不能“反转”(一旦将值添加到哈希中,就无法将其删除)。 “部分计算”值(计算临时哈希,并继续向其添加值)也更困难。
调用窗口函数的 SQL 是什么(使用
group_concat
进行演示),以便它像常规聚合函数一样被调用 - 永远不会调用 xValue
和 xInverse
(如 末尾所述) SQLite 文档 页),但仍然使用 OVER (ORDER BY value)
或类似的构造?
SQLite 3.44
SQLite 版本 3.44 支持聚合函数(如 PostgreSQL)中的 ORDER BY 子句。
您的案例如下:
SELECT sha256_concat(val ORDER BY val) FROM tbl;
文档:https://www.sqlite.org/lang_aggfunc.html
更改日志:https://sqlite.org/releaselog/3_44_0.html