Tengo una tabla en PostgreSQL con algunos datos:
create table t2 (
key jsonb,
value jsonb
);
INSERT INTO t2(key, value)
VALUES
('1', '"test 1"')
,('2', '"test 2"')
,('3', '"test 3"')
,('[]', '"test 4"')
,('[1]', '"test 5"')
,('[2]', '"test 6"')
,('[3]', '"test 7"')
,('[1, 2]', '"test 8"')
,('[1, 2, 3]', '"test 9"')
,('[1, 3]', '"test 10"')
,('[1,2,4]', '"test 11"')
,('[1, 2,4]', '"test 12"')
,('[1,3,13]', '"test 13"')
,('[1, 2, 15]', '"test 15"');
Y trato de ordenar estas filas así:
SELECT key FROM t2 order by key;
El resultado es:
[]
1
2
3
[1]
[2] <==
[3] <==
[1, 2]
[1, 3] <==
[1, 2, 3]
[1, 2, 4]
[1, 2, 4]
[1, 2, 15]
[1, 3, 13]
Pero lo que necesito es:
[]
1
2
3
[1]
[1, 2]
[1, 2, 3]
[1, 2, 4]
[1, 2, 4]
[1, 2, 15]
[1, 3] <==
[1, 3, 13]
[2] <==
[3] <==
¿Hay alguna manera de lograrlo?
Respuestas:
En primer lugar, su pregunta y el nombre de su columna
"key"
son engañosos. La clave de columna no contiene ninguna clave JSON , solo valores . De lo contrario, podríamos usar la funciónjsonb_object_keys(jsonb)
para extraer claves, pero no es así.Suponiendo que todas sus matrices JSON estén vacías o contengan números enteros como se demuestra. Y los valores escalares (no matrices) también son enteros.
Su orden de clasificación básico funcionaría con matrices Postgres
integer
(onumeric
). Utilizo esta pequeña función auxiliar para convertirjsonb
matrices a Postgresint[]
:Explicación:
Luego agregue
jsonb_typeof(jsonb)
para llegar a:Produce el resultado deseado exactamente.
¿Por qué?
El manual para
jsonb
explica:El énfasis audaz es mío.
Por eso
jsonb '[2]' < jsonb '[1, 2]'
.Pero las matrices de Postgres simplemente clasifican elemento por elemento:
'{2}'::int[] > '{1, 2}'
exactamente lo que estaba buscando.fuente
Refiriéndose al problema para ordenar sus resultados por valores enteros json. Tratar:
En su caso, parece ser una matriz para la clave de pedido. Así que primero intente concat los valores en su campo "clave".
fuente