Обсуждение: Вопрос по построению запросу
Здраствуйте.
Есть запрос:
SELECT * FROM spr.tovar
Надо вместо «*» поставить некую функцию, которая возвращала только одну строку типа text, содержащую информацию из всех столбцов таблицы. Т.е. соединяла их в одну строку.
Количество столбцов, как и их содержание неизвестно. Так что предложение на подобии kod||','||name||','||… не подходят.
Пример:
SELECT * FROM spr.tovar
X name …
-----------------------
1 tov1 …
2 tov2 …
А надо
SELECT ??? FROM spr.tovar
Text
------------
1,tov1,…
2,tov2,…
Заранее большое спасибо.
select string_agg('coalesce('||column_name||', '''')', '||'',''||' order by ordinal_position)
from information_schema.columns
where table_schema = 'spr'
Здраствуйте.
Есть запрос:
SELECT * FROM spr.tovar
Надо вместо «*» поставить некую функцию, которая возвращала только одну строку типа text, содержащую информацию из всех столбцов таблицы. Т.е. соединяла их в одну строку.
Количество столбцов, как и их содержание неизвестно. Так что предложение на подобии kod||','||name||','||… не подходят.
Пример:
SELECT * FROM spr.tovar
X name …
-----------------------
1 tov1 …
2 tov2 …
А надо
SELECT ??? FROM spr.tovar
Text
------------
1,tov1,…
2,tov2,…
Заранее большое спасибо.
select concat_ws(',', "spr.tovar".*) from spr.tovar
Здраствуйте.
Есть запрос:
SELECT * FROM spr.tovar
Надо вместо «*» поставить некую функцию, которая возвращала только одну строку типа text, содержащую информацию из всех столбцов таблицы. Т.е. соединяла их в одну строку.
Количество столбцов, как и их содержание неизвестно. Так что предложение на подобии kod||','||name||','||… не подходят.
Пример:
SELECT * FROM spr.tovar
X name …
-----------------------
1 tov1 …
2 tov2 …
А надо
SELECT ??? FROM spr.tovar
Text
------------
1,tov1,…
2,tov2,…
Заранее большое спасибо.
select concat_ws(',', "spr.tovar".*) from spr.tovar
20 октября 2014 г., 20:31 пользователь Владимир Комаров <vlads@sibnet.ru> написал:Здраствуйте.
Есть запрос:
SELECT * FROM spr.tovar
Надо вместо «*» поставить некую функцию, которая возвращала только одну строку типа text, содержащую информацию из всех столбцов таблицы. Т.е. соединяла их в одну строку.
Количество столбцов, как и их содержание неизвестно. Так что предложение на подобии kod||','||name||','||… не подходят.
Пример:
SELECT * FROM spr.tovar
X name …
-----------------------
1 tov1 …
2 tov2 …
А надо
SELECT ??? FROM spr.tovar
Text
------------
1,tov1,…
2,tov2,…
Заранее большое спасибо.
--wbr, Alexey Kolpakov
У меня несколько замечаний, которые я позволю себе высказать.
1.
>> select concat_ws(',', t.*) from spr.tovar t;
select t::text from spr.tovar t;
оба запроса по сути делают одно и то же, но второй заметно короче.
2.
>> select concat_ws(',', coalesce('', spr.tovar.*)) from spr.tovar
У coalesce здесь на первом месте константа '', а не проверяемое значение.
В таком случае результатом всегда будет пустая строка, потому что она не null.
3.
с таким coalesce postgres будет ругаться на круглые скобки (DETAIL:
Missing left parenthesis), указывая на первый апостроф пустой строки, т.е
он будет ожидать тип записи таблицы spr.tovar.
4.
честно говоря, у меня нет своего решения, но вот тут нашел одно
довольное интересное http://stackoverflow.com/questions/11469059/postgresql-return-entire-row-as-array
т.е. в вашем случае, Владимир, можно написать так:
select array_to_string(
translate(
string_to_array(t::text,',')::text, '()', ''
)::text[], ','
)
from spr.tovar t
Проверял на postgresql 9.3.4.
Если в чем-то неправ, прошу объяснить почему. Спасибо)
Не забываем про coalesce(), если не хотите удивляться !select concat_ws(',', coalesce('', spr.tovar.*)) from spr.tovar2014-10-20 21:03 GMT+04:00 Alexey Kolpakov <al.kolpak@gmail.com>:select concat_ws(',', "spr.tovar".*) from spr.tovar
20 октября 2014 г., 20:31 пользователь Владимир Комаров <vlads@sibnet.ru> написал:Здраствуйте.
Есть запрос:
SELECT * FROM spr.tovar
Надо вместо «*» поставить некую функцию, которая возвращала только одну строку типа text, содержащую информацию из всех столбцов таблицы. Т.е. соединяла их в одну строку.
Количество столбцов, как и их содержание неизвестно. Так что предложение на подобии kod||','||name||','||… не подходят.
Пример:
SELECT * FROM spr.tovar
X name …
-----------------------
1 tov1 …
2 tov2 …
А надо
SELECT ??? FROM spr.tovar
Text
------------
1,tov1,…
2,tov2,…
Заранее большое спасибо.
--wbr, Alexey Kolpakov
-- Dmitriy Olshevskiy
Да поменяйте аргументы в coalesc, я по памяти писал, ошибся. Главное, идея правильная
Здравствуйте, Олег, Владимир и Алексей.
У меня несколько замечаний, которые я позволю себе высказать.
1.
>> select concat_ws(',', t.*) from spr.tovar t;
select t::text from spr.tovar t;
оба запроса по сути делают одно и то же, но второй заметно короче.
2.
>> select concat_ws(',', coalesce('', spr.tovar.*)) from spr.tovar
У coalesce здесь на первом месте константа '', а не проверяемое значение.
В таком случае результатом всегда будет пустая строка, потому что она не null.
3.
с таким coalesce postgres будет ругаться на круглые скобки (DETAIL:
Missing left parenthesis), указывая на первый апостроф пустой строки, т.е
он будет ожидать тип записи таблицы spr.tovar.
4.
честно говоря, у меня нет своего решения, но вот тут нашел одно
довольное интересное http://stackoverflow.com/questions/11469059/postgresql-return-entire-row-as-array
т.е. в вашем случае, Владимир, можно написать так:
select array_to_string(
translate(
string_to_array(t::text,',')::text, '()', ''
)::text[], ','
)
from spr.tovar t
Проверял на postgresql 9.3.4.
Если в чем-то неправ, прошу объяснить почему. Спасибо)On 20.10.2014 21:29, Oleg Bartunov wrote:Не забываем про coalesce(), если не хотите удивляться !select concat_ws(',', coalesce('', spr.tovar.*)) from spr.tovar2014-10-20 21:03 GMT+04:00 Alexey Kolpakov <al.kolpak@gmail.com>:select concat_ws(',', "spr.tovar".*) from spr.tovar
20 октября 2014 г., 20:31 пользователь Владимир Комаров <vlads@sibnet.ru> написал:Здраствуйте.
Есть запрос:
SELECT * FROM spr.tovar
Надо вместо «*» поставить некую функцию, которая возвращала только одну строку типа text, содержащую информацию из всех столбцов таблицы. Т.е. соединяла их в одну строку.
Количество столбцов, как и их содержание неизвестно. Так что предложение на подобии kod||','||name||','||… не подходят.
Пример:
SELECT * FROM spr.tovar
X name …
-----------------------
1 tov1 …
2 tov2 …
А надо
SELECT ??? FROM spr.tovar
Text
------------
1,tov1,…
2,tov2,…
Заранее большое спасибо.
--wbr, Alexey Kolpakov-- Dmitriy Olshevskiy
По мне вам надо применять функции типа row_to_json или нечто подобное.