Postgresql: передача результата запроса select в jsonb_to_recordset не работает

#postgresql #jsonb

#postgresql #jsonb

Вопрос:

У меня есть таблица с нижеприведенным форматом.

Имя таблицы: данные

таблица данных

У меня есть приведенный ниже запрос для извлечения data2 jsonb.

 select comment->data2 from data where id=1
  

Я должен получить результирующий jsonb в виде набора записей, например

введите описание изображения здесь

Я подумал, что jsonb_to_recordset это поможет получить ожидаемый результат, но когда я попытался выполнить приведенный ниже запрос

 select * from json_to_recordset(select comment->data2 from data where id=1) as x(valueId text, valueType text);
  

но я получаю следующую ошибку

 Query 1 ERROR: ERROR:  syntax error at or near "select"
LINE 1: select * from json_to_recordset(select comment->data2...
  

Может кто-нибудь подсказать, что я здесь делаю не так?

Ответ №1:

Вам нужно заключить внутренний select в круглые скобки:

 select * 
from json_to_recordset( (select comment->data2 from data where id=1) ) as x(valueId text, valueType text);
  

Комментарии:

1. Ошибка исчезла, но результатом является пустая таблица. Что-нибудь еще нужно сделать?

2. Это настолько запутанно, поскольку пример, приведенный в документации , работает так, как ожидалось. select * from jsonb_to_recordset('[{"a":1,"b":"foo"},{"a":"2","c":"bar"}]') as x(a int, b text);

3. в то время как jsonb для моего usecase (примером в основном вопросе был sample, это ближе к реальным данным) не работает даже в самой простой форме. select * from jsonb_to_recordset('[{"fieldId":"1","fieldType":"selection","fieldValue":"6120"},{"fieldId":"2","fieldType":"selection"},{"fieldId":"3","fieldType":"text","fieldValue":"Sameple Text"},{"fieldId":"4","fieldType":"Text","fieldValue":"project code"}]') as x(fieldId text, fieldType text, fieldValue text);

4. Хорошо, я только что понял, что это работает должным образом, если ключи полностью в нижнем регистре …. не уверен, почему это так, и если это ошибка в postgresql. Работает приведенное ниже. select * from json_to_recordset('[{"fieldid":"1","fieldtype":"selection","fieldvalue":"6120"},{"fieldid":"2","fieldtype":"selection"},{"fieldid":"3","fieldtype":"text","fieldvalue":"Sameple Text"},{"fieldid":"4","fieldtype":"Text","fieldvalue":"project code"}]') as x(fieldid text, fieldtype text, fieldvalue text);

5. Использование «» работало для отображения имен полей как есть. x("fieldId" text, "fieldType" text, "fieldValue" text)