【问题标题】:Checksum MD5 to generate row number in postgresql校验和 MD5 在 postgresql 中生成行号
【发布时间】:2020-03-04 08:18:00
【问题描述】:

我正在尝试执行在我的错误报告中找到的以下查询。

当我们尝试运行 R 包时会生成错误报告。此错误报告可帮助我们了解错误在哪里以及如何重现错误。经过调查,我能够看到它是在 R 包执行时导致问题的查询。

select co.*, p.*,
      row_number() over (order by ABS(CHECKSUM(MD5(RANDOM()::TEXT || CLOCK_TIMESTAMP()::TEXT))) % 123456789) rn
    from s1.depat co
    join s2.person p
      on co.subject_id = p.person_id

我了解 row_number 函数用于生成行号,但看起来 Postgresql 不支持所有这些函数,如 ChecksumMD5

我收到以下错误

ERROR:  function checksum(text) does not exist
LINE 2:    row_number() over (order by ABS(CHECKSUM(MD5(RANDOM()::TE...
                                           ^
HINT:  No function matches the given name and argument types. You might need to add explicit type casts.
SQL state: 42883
Character: 54

如何避免上述错误并使其在 postgresql 中工作?

【问题讨论】:

  • 你可以通过只使用documented in the manual的函数来避免错误
  • 请问RANDOM::TEXT 是做什么的?无论如何要执行并查看RANDOM::TEXT 的外观或CLOCK_TIMESTAMP()::TEXT
  • :: 是一个类型转换。查看其他功能的文档。 PostgreSQL 中没有checksum 函数。

标签: sql postgresql md5 checksum


【解决方案1】:

在 Postgres 中,您将使用 random():

select co.*, p.*,
       row_number() over (order by random()) as rn
from s1.depat co join
     s2.person p
     on co.subject_id = p.person_id;

checksum() 的使用表明查询生成器认为您已连接到 SQL Server。可能有一个参数让它知道生成有效的 Postgres 代码。

【讨论】:

  • 感谢您的回复。赞成。但是MD5呢。 MD5 虽然可以在 postgres 中使用,但不能用作序列号。正确的?它把它变成一个字符串?
  • @TheGreat 。 . .如果您正在寻找可重复的序列,您可以使用MD5()。但是 SQL Server 需要函数链,因为它没有一个简单的 random() 函数可以为每一行调用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-20
  • 2021-12-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多