2015-11-05 4 views
9

Я хотел бы использовать UUID в качестве идентификатора, предоставить первые 8 цифр, чтобы узнать, существует ли он в базе данных.Как запросить UUID для postgres

обычно я могу это сделать без проблем:

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 или тип UUID в postgresql?

ответ

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 (должен быть немного быстрее, чем сравнение 'text', но это зависит от многих вещей). – pozs

4

UUID не сохраняются в виде строк в Postrges, они сохраняются как двоичные значения длиной в 16 байт. Таким образом, единственный способ запросить его так, как вы хотите, - сначала преобразовать его в строку, но производительность такого преобразования будет хуже, чем просто сравнение сравнений.

Также вам нужно будет поддерживать индекс для этих строковых представлений UUID, поэтому это просто не имеет смысла.

+0

имеет смысл, но я хотел бы сделать что-то как короткие атрибуты git SHA в postgresql. что-то вроде этого: [link] (http://stackoverflow.com/questions/18134627/how-much-of-a-git-sha-is-generally-considered-necessary-to-uniquely-identify-a) –

+1

well то либо просто сохраните префикс в виде строки в кодировке interger/hex в другом столбце, либо используйте решение, предложенное pozs. –

Смежные вопросы