【问题标题】:How to query UUID for postgres如何查询 postgres 的 UUID
【发布时间】:2016-02-06 14:15:18
【问题描述】:

我想使用 UUID 作为标识符,提供前 8 位数字以确定它是否存在于数据库中。

通常我可以毫无问题地做到这一点:

select * from TABLE where id = 'e99aec55-9e32-4c84-aed2-4a0251584941'::uuid

但这给了我错误:

select * from TABLE where id LIKE 'e99aec55%@'::uuid

错误:

ERROR:  invalid input syntax for uuid: "e99aec55%@"
LINE 1: select * from TABLE where id LIKE 'e99aec55...
                                              ^
Query failed
PostgreSQL said: invalid input syntax for uuid: "e99aec55%@"

有没有办法在 postgresql 中查询 UUID 类型的前 n 位数字?

【问题讨论】:

    标签: ruby-on-rails postgresql activerecord


    【解决方案1】:

    由于您正在搜索uuids 的最高位,因此您实际上可以使用between(因为uuid 比较在PostgreSQL 中是明确定义的):

    ...
    where some_uuid between 'e99aec55-0000-0000-0000-000000000000'
                        and 'e99aec55-ffff-ffff-ffff-ffffffffffff'
    

    【讨论】:

    • 这太酷了!我正在考虑使用 uuid 和 uuid 字符串创建一个表,以便它使用正常搜索。但你的方法效果很好。谢谢!
    • 你知道Postgresql中使用这种比较时的性能吗?
    • @ZitaoXiong 它实际上使用了一个简单的btree(应该比比较texts 稍快,但这取决于很多事情)。
    【解决方案2】:

    UUID 在 Postrges 中不存储为字符串,它们存储为 16 字节长的二进制值。所以以你想要的方式查询它的唯一方法是首先将它转换为字符串,但这种转换的性能会比只执行相等比较更差。

    此外,您还需要在 UUID 的那些字符串表示上维护一个索引,所以这没有任何意义。

    【讨论】:

    • 有道理,但我想在 postgresql 中实现 git 的 SHA 短字符之类的东西。像这样的东西:link
    • 那么要么将前缀作为整数/十六进制编码字符串存储在另一列中,要么使用 pozs 提出的解决方案。
    猜你喜欢
    • 2019-04-18
    • 2021-10-18
    • 2017-01-19
    • 2015-05-24
    • 1970-01-01
    • 1970-01-01
    • 2010-10-20
    • 2014-05-13
    • 1970-01-01
    相关资源
    最近更新 更多