我想创建一个 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/