Estoy buscando una forma de extraer valores de un objeto JSONB usando una matriz de claves. Aquí está mi JSON:
{ "Foo1": 1, "Foo2": 2, "Foo3": 3, "Foo3": 4 }Tengo una variable llamada "@Fields" que es de tipo TEXT[]. La matriz contiene el nombre de las claves que me gustaría extraer del objeto, es decir. {'Foo1', 'Foo2'}. El resultado debería ser:
{ "Foo1": 1, "Foo2": 2 }Estaba usando JSONB_EXTRACT_PATH("Data"::jsonb, "@Fields"), sin embargo, parece que la función requiere pasar las rutas como parámetros individuales, mientras que quiero darle una matriz de alguna manera. Así es como se ve en mi consulta:
SELECT "UserID", ( CASE WHEN ARRAY_LENGTH("@Fields", 1) = 0 THEN "Data" ELSE JSONB_EXTRACT_PATH("Data", "@Fields") END ) AS "Data" FROM UserMeta¿Sospecho que tendré que usar JSON_EACH o algo similar?
Solo puede eliminar claves una por una con el operador - . Para todo lo demás, necesitará una subselección, donde extraiga cada par clave-valor, los filtre (aquí viene su lógica, que puede ser cualquier cosa por cierto), luego agregue los valores:
(select jsonb_object_agg(key, value) from jsonb_each(data) where key = any(keys_should_stay)) sub_selectEjemplo de uso en contexto: http://rextester.com/OANQ93761
EDITAR: si desea un significado específico para una matriz vacía (es decir, conservar todas las claves), use este predicado en su lugar:
where key = any(keys_should_stay) or cardinality(keys_should_stay) = 0