Eu tenho uma tabela de texto e tipo de precisão dupla. A partir dele, quero construir um objeto JSON que se pareça com isso: {"a": 1.0, "b": 1.2, "c": 3.4}
(edit: para esclarecer, as chaves são a coluna de texto na minha tabela e os valores são a coluna de precisão dupla). Observe que não há aspas em torno dos valores porque eles são floats, não strings, que o padrão JSON suporta.
Usando Postgres 9.5. Existe a json_build_object
função que pega dois arrays de texto paralelos e constrói um objeto JSON com chaves de texto e valores de texto... também trabalha com valores NULL, transformando-os em null
(sem aspas) em JSON. Então eu pegaria {"a": "1.0", "b": "1.2", "c": "3.4"}
. Mas e se eu quiser valores inteiros ou flutuantes? Não levará nenhum array de tipo numérico.
Eu contornei isso por enquanto criando minha própria função para lidar com isso em Python! Existe uma maneira de fazer isso sem definir uma nova função?
CREATE OR REPLACE FUNCTION json_build_object_float_values(keys TEXT[], vals DOUBLE PRECISION[]) RETURNS JSONB AS
$$
assert len(keys) == len(vals)
import json
d = {}
for i in range(len(keys)):
d[keys[i]] = float(vals[i])
return json.dumps(d)
$$
LANGUAGE 'plpython3u' IMMUTABLE;
(observe se você usar isso, ele retorna JSONB, mas você pode alterá-lo para JSON)
Edite, aqui está a entrada de teste e a saída esperada:
CREATE TABLE test (str text, num double precision);
INSERT INTO test(str, num) VALUES ('a', 1.0);
INSERT INTO test(str, num) VALUES ('b', 2.3);
-- Here's my solution using my custom function...
SELECT json_build_object_float_values(array_agg(str), array_agg(num)) FROM test;
-- expected output:
-- json_build_object_float_values
-- --------------------------------
-- {"a": 1.0, "b": 2.3}
-- (1 row)
Mais simples:
SELECT json_build_object_float_values(ARRAY['the', 'quick'], ARRAY[1, 3]);
json_build_object_float_values
--------------------------------
{"the": 1.0, "quick": 3.0}
(1 row)
Atualizar
De acordo com seus dados de amostra e resultado desejado, você pode obtê-lo usando a função json_object_agg Postgres.
dbfiddle aqui
Você pode usar a função Postgres row_to_json .
dbfiddle aqui