Rapide et sans SQL dynamique
Convertir les 16 premiers chiffres hexadécimaux d'un UUID en représentation textuelle en bitstring bit(64)
et transmettez-le à bigint . Voir :
Idéalement, les chiffres hexadécimaux en excès à droite sont tronqués dans le cast en bit(64) automatiquement - exactement ce dont nous avons besoin.
Postgres accepte différents formats d'entrée. Votre littéral de chaîne donné en fait partie :
14607158d3b14ac0b0d82a9a5a9e8f6e
La représentation textuelle par défaut d'un UUID (et le text sortie dans Postgres pour le type de données uuid ) ajoute des traits d'union à des endroits prédéfinis :
14607158-d3b1-4ac0-b0d8-2a9a5a9e8f6e
Si le format d'entrée peut varier, supprimez d'abord les traits d'union pour être sûr :
SELECT ('x' || translate(uuid_as_string, '-', ''))::bit(64)::bigint;
Diffuser uuid
entrée avec uuid::text .
db<>violon ici
Notez que Postgres utilise signed entier, donc le bigint déborde sur des nombres négatifs dans la moitié supérieure - ce qui ne devrait pas être pertinent à cette fin.
Conception de la base de données
Si possible, ajoutez un bigserial
colonne à la table sous-jacente et l'utiliser à la place.