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.