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

Los operadores bit a bit de PostgreSQL con variación de bits no pueden Y cadenas de bits de diferentes tamaños

El comportamiento del bit de PostgreSQL y bit varying tipos es extremadamente inútil, con la forma en que se niega a extender los campos de bits para las operaciones, y los extiende a la derecha para las conversiones en lugar de extenderlos a la izquierda.

Tendría sentido que Pg extendiera a la izquierda el operando más pequeño con ceros antes de una operación AND u OR, en lugar de fallar.

No puedes usar una conversión a bit(n) para obtener las mismas longitudes, porque por alguna razón insensata se convirtió a bit(n) almohadillas derechas el argumento, haciéndolo inútil en casi todas las situaciones.

Puede usar algo como lpad($1::text, greatest(length($1), length($2)),'0')::bit varying para extender a la izquierda un campo de bits con ceros a la mayor de dos longitudes. Es engorroso, pero funcionará. Recomiendo escribir funciones de envoltura para contener el desorden.

Alternativamente, considere modificar el bit código de soporte en src/backend/utils/adt/varbit.c para agregar funciones a los campos de bits extendidos a la izquierda y truncados a la izquierda, y funciones para hacer comparaciones extendidas a la izquierda. Debería ser bastante fácil según el código existente.