sql >> Base de Datos >  >> RDS >> PostgreSQL

Cree un entero grande desde el extremo grande de un uuid en PostgreSQL

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

El manual:

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.