gpt4 book ai didi

SQL方式获取整行的MD5或SHA1

转载 作者:行者123 更新时间:2023-12-01 17:20:36 25 4
gpt4 key购买 nike

是否有一种“半可移植”方法来获取整行的 md5() 或 sha1() ? (或者更好的是,按所有字段排序的整组行,即 order by 1,2,3,...,n)?不幸的是,并非所有数据库都是 PostgreSQL...我至少必须处理 Microsoft SQL Server、Sybase 和 Oracle。

理想情况下,我希望有一个聚合器(服务器端)并使用它来检测行组中的更改。例如,在具有某些时间戳列的表中,我想存储每个月的唯一签名。然后我可以快速检测自上次访问以来发生变化的月份(我将某些表镜像到运行 Greenplum 的服务器)并重新加载它们。

我研究了几个选项,例如tsql 中的 checksum(*) (可怕:它非常容易发生冲突,因为它基于一堆 XOR 和 32 位值)和 hashbytes('MD5', field),但后者不能应用于整行。这将为我提供一个针对我必须处理的 SQL 风格之一的解决方案。

有什么想法吗?即使只是上面提到的 SQL 惯用法之一,那就太好了。

最佳答案

您可以在更新触发器上计算整行的哈希字节值,我将其用作 ETL 过程的一部分,之前他们比较表中的所有列,速度提升巨大。

Hashbytes 适用于 varchar、nvarchar 或 varbinary 数据类型,我想比较整数键和文本字段,转换所有内容将是一场噩梦,因此我在 SQL Server 中使用了 FOR XML 子句,如下所示:

CREATE TRIGGER get_hash_value ON staging_table
FOR UPDATE, INSERT AS
UPDATE staging_table
SET sha1_hash = (SELECT hashbytes('sha1', (SELECT col1, col2, col3 FOR XML RAW)))
GO

或者,如果您计划使用带有 for xml 子句的子查询对所有行进行多次更新,则可以在触发器之外以类似的方式计算值。如果走这条路线,您甚至可以将其更改为 SELECT *,但不能在触发器中更改,因为每次运行它时您都会得到不同的值,因为 sha1_hash 列每次都会不同。

您可以修改 select 语句以获取多于 1 行

关于SQL方式获取整行的MD5或SHA1,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16452658/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com