#sql #postgresql
Вопрос:
Я пытаюсь отобразить значения массива с помощью запроса PostgreSQL, подобного этому, несколько значений отображаются в нескольких строках по одному идентификатору.
Стол:
id name dept.
1 name1 xxxx
1 name2 yyyy
2 name3 zzzz
4 name4 zzzz
Получите ответ по идентификатору, необходимый для этой
таблицы:
id name dept.
1 name1 xxxx
name2 yyyy
2 name3 zzzz
3 name4 zzzz
Комментарии:
1. Зачем вам нужно все в один ряд? Почему бы вам не добавить строки на стороне клиента?
2. Поскольку запрос принимает значения очень быстро, на стороне клиента это будет происходить медленно, используя больше циклов, если это невозможно на стороне запроса, я выберу вариант на стороне клиента.
3. @MuhammedArif Я немного сбит с толку. Можете ли вы правильно отформатировать образец данных, чтобы мы могли видеть, как вы ожидаете, что набор результатов будет выглядеть?
4. Такой вид форматирования гораздо лучше выполняется на стороне клиента, когда вы отображаете данные в своем приложении. Время запроса определяется не только количеством строк, но и размером результата. И простое форматирование его немного по-другому не изменяет размер. Я сомневаюсь, что вы увидите какое-либо улучшение производительности, если сделаете это (возможно, даже более медленный запрос, поскольку базе данных теперь нужно только «отформатировать вывод», а не просто возвращать результат запроса напрямую).
5. Спасибо, Ext js используется на стороне клиента.
Ответ №1:
Вы хотите сгруппировать свои данные, поэтому место для поиска находится в [список агрегированных функций] (https://www.postgresql.org/docs/current/functions-aggregate.html), в данном случае это string_agg ( value text, delimiter text ) → text
Вы хотите объединить данные из имен и отделов, и вы хотите, чтобы имена и отделы были в отдельных строках, как показано в примере. Для этого E'n'
следует использовать разделитель:
SELECT
id,
string_agg(name, E'n') as names,
string_agg(dept, E'n') as depts
FROM
data
GROUP BY
id
ORDER BY
id;
В ответе показано, как это сделать, а в комментариях объясняется, почему этого не следует делать. Теперь выбор за тобой.
ПРАВКА 1
Если вы предпочитаете сохранять количество записей и отображать идентификатор в первой строке группы, вам следует изучить функции окна. В частности, ОТСТАВАНИЕ.
SELECT
CASE
WHEN id IS DISTINCT FROM LAG(id) OVER(order by id) THEN id
ELSE null
END as id,
name,
dept
FROM
data
order by
data.id;
sql сравнивает текущий идентификатор с идентификатором предыдущей строки и выводит его или нулевое значение.
Комментарии:
1. Это отображается в одном столбце и одной строке, как это имя:[name1,name2], отдел:[xxxx, гггг], мне нравится получать один столбец и несколько строк для одного идентификатора. если это возможно.
2. Пожалуйста, объясните, как вы хотите получить результат? Вы хотите, чтобы идентификатор отображался в первой строке группы, а не в других строках?
3. Да, идентификатор показывает только первую строку группы и не показывает другие строки (на основе значений одного массива).
4. спасибо, теперь все в порядке. Я сверюсь со своим контекстом.
5. Как можно объединить несколько таблиц, используя один идентификатор.