Rápido y sin SQL dinámico
Transmita los primeros 16 dígitos hexadecimales de un UUID en representación de texto como bitstring bit(64)
y enviar eso a bigint
. Ver:
Convenientemente, el exceso de dígitos hexadecimales a la derecha se trunca en la conversión a bit(64)
automáticamente - exactamente lo que necesitamos.
Postgres acepta varios formatos de entrada. Su literal de cadena dado es uno de ellos:
14607158d3b14ac0b0d82a9a5a9e8f6e
La representación de texto predeterminada de un UUID (y el text
salida en Postgres para el tipo de datos uuid
) añade guiones en lugares predefinidos:
14607158-d3b1-4ac0-b0d8-2a9a5a9e8f6e
Si el formato de entrada puede variar, elimine los guiones primero para estar seguro:
SELECT ('x' || translate(uuid_as_string, '-', ''))::bit(64)::bigint;
Reparto real uuid
entrada con uuid::text
.
db<>fiddle aquí
Tenga en cuenta que Postgres usa firmado entero, por lo que bigint
se desborda a números negativos en la mitad superior, lo que debería ser irrelevante para este propósito.
Diseño de base de datos
Si es posible, agregue un bigserial
columna a la tabla subyacente y utilícela en su lugar.