2015-11-05 245 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提出的解決方案。 –