Nalezení nejdelší společné části (prefixu) UUIDv4 rubrika: Databáze: SQL
Přemýšlím, jak nejjednoduššejc v SQL (Postgres) najít nejdelší společnou část (prefix) několika UUIDv4.
Dejme tomu, že mám nějakou tabulku s IDčkem (primární klíč) v UUIDv4 formátu (např. 86914ca4-3986-4d72-8b46-a934c57300c5).
A já potřebuju najít nejdelší společnej prefix mezi IDčkama v tý tabulce a nějakym konkrétnim UUIDv4.
Tj. pokud budou v databázi třeba jen 3 záznamy.
86914ca4-3986-4d72-8b46-a934c57300c5
86914ca4-ffff-ffff-ffff-ffffffffffff
86914ca4-3986-ffff-ffff-ffffffffffff
Tak aby mi to našlo 86914ca4-3986 pokud budu porovnávat třeba s 86914ca4-3986-aaaa-aaaa-aaaaaaaaaaaa.
Nevím, jestli se k tomu chovat jako ke stringu nebo to jde nějak "vypočítat" (ne doslova)... A zároveň bych se rád vyhnul instalování extenzí a nejlíp i stored proceduře / funkci, triggerům a pohledům, protože ORM (ale pokud by to jinak nešlo, tak i to se dá).
Samozřejmě jsem googlil a pár řešení našel, ale většinou ty řešení jsou až zbytečně komplexní. Nemusí to být nějak ultra super rychlý (zjištění by probíhalo při vložení novýho záznamu), ale ultra super pomalý to taky být nemusí.
Víceméně je to podobná fíčura jako třeba identifikování commitu v GITu pomocí části hashe.
No pokud ty záznamy abecedně srovnám (a oindexuju) a představím si, že tam ten nový mám již také vložený, tak je podle mě jasné, že nejpodobnější mu bude buď ten přímo před ním nebo ten přímo za ním. Takže podle mě stačí si tyto dva vytáhnout a pak z nich vybrat ten lepší. Tj.
SELECT uuid FROM uuids WHERE uuid > "new-uuid" ORDER BY uuid ASC LIMIT 1
SELECT uuid FROM uuids WHERE uuid < "new-uuid" ORDER BY uuid DESC LIMIT 1
Takže jsem nad tím uuid nepoužil v db žádnou stringovou funkci a vzhledem k indexaci to musí být jak rychlý jak vítr. Vybrat z těch dvou potom ten lepší a najít společnou část je z hlediska zatížení triviální a lze to naprogramovat buď v PHP nebo Postgres.
Pro zobrazení všech 4 odpovědí se prosím přihlaste:
Nebo se přihlaste jménem a heslem:
Komentáře