Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / PostgreSQL Новый топик    Ответить
 pgsql _выборка из таблицы в строку  [new]
Alex_Wong
Member

Откуда:
Сообщений: 164
Таблица tb три поля: p01, p02, p03 содержит три строки:
   p01,int     p02,text     p03,boolean
 ----------------------------------------
    111          abc            false
    222          sql            true
    333          xyz            false

Как в функции (pgsql) в одну строку получить результат:
 "1":111, "2":"abc", "3":false, "4":222, "5":"sql", "6":true, "7":333, "8":"xyz", "9":false

Если полей много и критично по скорости, как правильно поступают, чтобы получить на
клиенте в браузере? Можно ли по примеру передать в браузер вот такой набор:
 111, "abc", false, 222, "sql", true, 333, "xyz", false

например, как элементы массива, чтобы, получив через JSON.parse(xhr.responseText) на
клиенте, я смог их поместить в массив js. Делал через:
arr := ARRAY(SELECT to_json(p01::int) || ',' || to_json(p02::text) || ',' || to_json(p03::boolean) ...

но получилось, если поле одно, а для нескольких полей таблицы с разными типами данных,
- они как один элемент массива, - на выходе имею всё как строки после json_object().

В идеале хочу отдать на клиента из функции postgres короткий набор : 111, "abc", false, ...
с сохранением типов данных. Подскажите, плиз, как правильно.
21 июл 20, 10:54    [22170874]     Ответить | Цитировать Сообщить модератору
 Re: pgsql _выборка из таблицы в строку  [new]
Maxim Boguk
Member

Откуда: Melbourne, Австралия
Сообщений: 4233
Alex_Wong,

"короткий набор : 111, "abc", false, ...
с сохранением типов данных"

так не бывает
бывает
или фиксированная структура данных с ТИПАМИ
или произвольная структура данных (json) но БЕЗ ТИПОВ

json - он нетипизированный
21 июл 20, 13:08    [22170955]     Ответить | Цитировать Сообщить модератору
 Re: pgsql _выборка из таблицы в строку  [new]
Alex_Wong
Member

Откуда:
Сообщений: 164
Maxim Boguk,
подскажите, пожалуйста, так на выходе функции можно получить из приведенной таблицы:
{"1":111, "2":"abc", "3":false, "4":222, "5":"sql", "6":true, "7":333, "8":"xyz", "9":false}

у меня получается только так:
{"1":"111", "2":"abc", "3":"false", "4":"222", "5":"sql", "6":"true", "7":"333", "8":"xyz", "9":"false"}
21 июл 20, 13:43    [22171011]     Ответить | Цитировать Сообщить модератору
 Re: pgsql _выборка из таблицы в строку  [new]
Maxim Boguk
Member

Откуда: Melbourne, Австралия
Сообщений: 4233
Alex_Wong
Maxim Boguk,
подскажите, пожалуйста, так на выходе функции можно получить из приведенной таблицы:
{"1":111, "2":"abc", "3":false, "4":222, "5":"sql", "6":true, "7":333, "8":"xyz", "9":false}

у меня получается только так:
{"1":"111", "2":"abc", "3":"false", "4":"222", "5":"sql", "6":"true", "7":"333", "8":"xyz", "9":"false"}


покажите код которым вы это делаете... потому что штатный row_to_json как и json_build_object так себя не ведут
судя по https://www.postgresql.org/docs/12/functions-json.html
вы свои поля явно или не явно где то приводите сами к text вот и получаете лишние кавычки
21 июл 20, 15:10    [22171097]     Ответить | Цитировать Сообщить модератору
 Re: pgsql _выборка из таблицы в строку  [new]
Maxim Boguk
Member

Откуда: Melbourne, Австралия
Сообщений: 4233
Alex_Wong,

Самое простое и самое правильное решение всетаки валидный json сделать

mboguk=# create table test (p01 int, p02 text, p03 boolean);
CREATE TABLE
mboguk=# insert into test values (111,'abc',false),(222,'sql',true),(333,'xyz',false);
INSERT 0 3
mboguk=# select json_agg(to_json(test)) from test;
                                                    json_agg                                                    
----------------------------------------------------------------------------------------------------------------
 [{"p01":111,"p02":"abc","p03":false}, {"p01":222,"p02":"sql","p03":true}, {"p01":333,"p02":"xyz","p03":false}]


или если вам надо без названий полей то

select jsonb_agg(to_jsonb(p01)||to_jsonb(p02)||to_jsonb(p03)) from test;
                           jsonb_agg                            
----------------------------------------------------------------
 [[111, "abc", false], [222, "sql", true], [333, "xyz", false]]


Сообщение было отредактировано: 21 июл 20, 20:18
21 июл 20, 20:14    [22171251]     Ответить | Цитировать Сообщить модератору
 Re: pgsql _выборка из таблицы в строку  [new]
Alex_Wong
Member

Откуда:
Сообщений: 164
Maxim Boguk,
Вы правы, я делал не правильно. Хотел использовать часть логики, где ранее данные
таблицы легли в массив, - привёл в теле вопроса: arr := ARRAY(SELECT ... , но получил
не упрощение, а ... и лишние кавычки. Спасибо, помогли.
22 июл 20, 09:26    [22171436]     Ответить | Цитировать Сообщить модератору
Все форумы / PostgreSQL Ответить