【问题标题】:How to cast text to bit(64) in Redshift? Use PostgreSQL expression in Redshift如何在 Redshift 中将文本转换为 bit(64)?在 Redshift 中使用 PostgreSQL 表达式
【发布时间】:2022-12-14 09:34:28
【问题描述】:

你能帮我把 PostgreSQL 语法中的这个表达式转换成 Redshift 语法吗:

(('x'::text || lpad(md5('0036f392-c2bc-46d5-b413-cd7772bcd4a1'), 16, '0'::text)))::bit(64)::bigint

结果等于 PostgreSQL 中的-5735530232431975337。 Redshift 抛出错误:“无法将类型文本转换为位”。

更新程序 好像在这里问了类似的问题Hex string to integer conversion in Amazon Redshift

【问题讨论】:

    标签: casting amazon-redshift


    【解决方案1】:

    strtol() 函数采用任何基数的字符串表示形式并将其转换为 bigint。 https://docs.aws.amazon.com/redshift/latest/dg/r_STRTOL.html

    我用它来将 md5() 结果更改为整数以进行求和和比较。我在这里的另一个答案中写下了这个:More efficient way of comparing two tables in Redshift?

    【讨论】:

    • 谢谢,所以基本上 select strtol((lpad(md5('UUID string'), 16, '0')), 16) 对一些 UUID 做同样的事情。例如,对于这个值0010f3c8-cbf7-49c7-986e-9716085448d5。但是对于那些 Postgre 表达式返回负值的 UUID,比如 0061d649-1f3b-4478-bfea-09a1c6012bc0 redshift 返回 9223372036854775807,这似乎是最大的整数值。你知道什么可能是错的吗?
    • 我希望这样。第二个字符串的 md5() 是 fb85eb3458d660193e238cbd55628e97,它最左边的位为 1,二进制表示负数。然而 strtol() 没有做出这样的假设。您可以根据第一位创建一个 CASE 语句并进行正确的计算,但我预计还有另一个问题。 md5() 返回 128 位值,但 BIGINT 仅包含 64 位值。你是如何防止溢出的?我使用 substring() 来选择 md5 值的一部分。
    • lpad 将返回一个子字符串:“..如果比剩余长度或指定长度长,它将在右侧被截断。”
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多