JSONB-запрос PostgreSQL 9.6 с использованием как на массивах - PullRequest
0 голосов
/ 20 сентября 2019

мне нужно запросить поле таблицы jsonb с помощью нормальных функций.

Это мое поле json

  "campi":[ 
    { 
      "label":"testLabel",
      "valore":[ 
        "testValore",
        "testValore2"
      ],
      "idCampo":"testID",
      "idCampoTP":"testCampoID",
      "proprieta":[ 
        { 
          "label":"testLabel",
          "idProprieta":"testProp"
        }
      ],
      "idTipoCampo":"idTipoCampoID"
    },
    { 
      "label":"testLabel2",
      "valore":[ 
        "testValore3",
        "testValore4"
      ],
      "idCampo":"testID2",
      "idCampoTP":"testCampoID2",
      "proprieta":[ 
        { 
          "label":"testLabel2",
          "idProprieta":"testProp2"
        }
      ],
      "idTipoCampo":"idTipoCampoID2"
    }
  ]
}

Можно ли даже сделать запрос, подобный этому?

SELECT customfield from procedura WHERE customfield->'campi' @> '[{"label":"testLabel3"}]'

Но с testLabel3 с такими же подстановочными знаками: testLabel%

Другой вопрос, возможно ли даже сделать запрос для получения объекта (ов) "campi" с "valore" из "testValore"?

Запрос моей мечты был:

SELECT customfield from procedura WHERE customfield->'campi' @> '[{"label":"testLabel%"}]'

С% в качестве подстановочного знака

РЕДАКТИРОВАТЬ:

IМожно сделать простой запрос:

SELECT customfield FROM procedura, jsonb_array_elements(procedura.customfield #> '{campi}') obj
WHERE  obj->>'idCampoTP' LIKE 'testCampoID3%' group by procedura.id;

, но я не могу понять, как искать в массиве valore field

РЕДАКТИРОВАТЬ:

Я нашел этот способ, но мне кажется, дерьмовое решение

SELECT customfield FROM procedura, jsonb_array_elements(procedura.customfield #> '{campi}') obj
WHERE  obj->>'valore' LIKE '%stValore5%' group by procedura.id;

1 Ответ

0 голосов
/ 20 сентября 2019

Да, это работает:)

Для фильтрации типа 'testValore', как вы уже упоминали в своем вопросе

data -> 'campi' @> '[{"label ":" testLabel3 "}] ';

Для извлечения идентификатора со значением типа' testValore '

data ->' campi '@>' [{"valore ": [" testValore "]}] ';

...