2015-11-05 17 views
9

Tôi muốn sử dụng UUID làm số nhận dạng, cung cấp 8 chữ số đầu tiên để tìm hiểu xem nó có tồn tại trong cơ sở dữ liệu hay không.Cách truy vấn UUID cho postgres

thường tôi có thể làm điều này mà không có một vấn đề:

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

nhưng điều này mang lại cho tôi lỗi:

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

lỗi:

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

Có cách nào để truy vấn n chữ số đầu tiên f hoặc một loại UUID trong postgresql?

Trả lời

8

Vì bạn đang tìm kiếm các bit cao nhất của uuid s, bạn thực sự có thể sử dụng between (vì uuid so sánh được xác định rõ trong PostgreSQL):

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

Điều này thật tuyệt! Tôi đã suy nghĩ để tạo ra một bảng với uuid và chuỗi uuid để nó sử dụng tìm kiếm bình thường. nhưng phương pháp của bạn hoạt động rất tốt. Cảm ơn! –

+0

Bạn có biết hiệu suất trong Postgresql khi sử dụng so sánh loại này không? –

+0

@ZitaoXiong nó thực sự sử dụng một btree đơn giản (nên hơi nhanh hơn so với 'text's, nhưng điều đó phụ thuộc vào rất nhiều thứ). – pozs

4

UUID không được lưu trữ dưới dạng chuỗi trong Postrges, chúng được lưu trữ dưới dạng giá trị nhị phân dài 16 byte. Vì vậy, cách duy nhất để truy vấn nó theo cách bạn muốn là chuyển đổi nó thành chuỗi đầu tiên, nhưng hiệu suất của chuyển đổi như vậy sẽ tồi tệ hơn là chỉ thực hiện so sánh bình đẳng.

Ngoài ra, bạn sẽ cần phải duy trì chỉ mục về biểu diễn chuỗi của UUID, vì vậy nó không có ý nghĩa.

+0

có ý nghĩa, nhưng tôi muốn thực hiện một cái gì đó như git của charcters ngắn của SHA trong postgresql. một cái gì đó như thế này: [link] (http://stackoverflow.com/questions/18134627/how-much-of-a-git-sha-is-generally-considered-necessary-to-uniquely-identify-a) –

+1

well sau đó, hoặc chỉ lưu trữ tiền tố dưới dạng một chuỗi được mã hóa/thập phân trong một cột khác hoặc sử dụng giải pháp được đề xuất bởi các poz. –

Các vấn đề liên quan