2015-11-05 254 views
9

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

通常我可以做到这一点没有问题:

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%@" 

是否有办法查询前n个数字f或postgresql中的UUID类型?

回答

8

既然你正在寻找的uuid史上最高位,你可以实际使用between(因为uuid比较PostgreSQL中明确定义):

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

这很酷!我正在考虑用uuid和uuid字符串创建一个表,以便使用正常搜索。但你的方法工作得很好。谢谢! –

+0

使用此类比较时,您是否知道Postgresql中的性能? –

+0

@ZitaoXiong它实际上使用了一个简单的btree(应该比比较'文本'稍微快一点,但这取决于很多东西)。 – pozs

4

UUID不作为字符串存储在Postrges中,它们存储为16字节长的二进制值。因此,以您想要的方式查询它的唯一方法是首先将其转换为字符串,但此类转换的性能将比执行平等比较更差。

此外,您需要维护UUID的字符串表示形式的索引,因此它没有任何意义。

+0

是有意义的,但我想实现的东西就像git在postgresql中SHA的简短字符一样。像这样:[link](http://stackoverflow.com/questions/18134627/how-much-of-a-git-sha-is-generally-considered-necessary-to-uniquely-identify-a) –

+1

well然后将前缀作为整数/十六进制编码的字符串存储在另一列中,或者使用pozs提出的解决方案。 –