sql - 如何 md5 所有列而不考虑类型

标签 sql postgresql md5 plpgsql

我想创建一个 sql 查询(或 plpgsql),它将 md5() 所有给定的行,无论类型如何。但是,在下面,如果一个为空,则哈希为空:

UPDATE thetable 
    SET hash = md5(accountid || accounttype || createdby || editedby);

我稍后使用散列来比较唯一性,因此 null 散列不适用于此用例。

问题在于它处理连接空值的方式。例如:

thedatabase=# SELECT accountid || accounttype || createdby  || editedby 
                 FROM thetable LIMIT 5;  

1Type113225  
<NULL>
2Type11751222 
3Type10651010 
4Type10651

如果我知道类型,我可以使用 coalesce 或 CASE 语句;但是,我有很多表,我不会提前知道每一列的类型。

最佳答案

对此有更优雅的解决方案。

在 Postgres 中,允许在 SELECT 中使用表名,它的类型为 ROW。如果将其转换为 TEXT 类型,它会将所有列连接在一起,形成实际上是 JSON 的字符串。

有了这个,你可以得到所有列的md5如下:

SELECT md5(mytable::TEXT)
FROM mytable

如果您只想使用某些列,请使用ROW 构造函数并将其转换为TEXT:

SELECT md5(ROW(col1, col2, col3)::TEXT)
FROM mytable

此解决方案的另一个不错的特性是 md5 对于 NULL 与空字符串是不同的。

强制性 SQLFiddle .

关于sql - 如何 md5 所有列而不考虑类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14576010/

相关文章:

java - Azure函数计算md5校验和

c - 除了(可能)内存使用之外,是否将 uint32 交换为 uint64 良性?

SQL 用新值替换旧值

mysql - 多个不同 ID 的总和计算问题

ruby-on-rails - 为什么 postgres 9.3 表不断丢失主键和索引?

python 将 "E"添加到字符串

来自 Web 服务的相同字符串的 Java md5 哈希对于每个事务都是不同的

SQL:使用 MySQL 4 获取非耦合项列表

sql - 查找所有相关记录

sql - 在 postgresql 选择中,将时间戳列添加到 additional_days 列