Получить все значения array_agg() с одним совпадающим значением Postgres

#postgresql

#postgresql

Вопрос:

Я хочу получить все значения array_agg() с одним совпадающим значением.

Например, если внутри robotsession."Session_OS" есть несколько значений [‘Android’, ‘IOS’, ‘Windows’]

В моем текущем запросе он выдает только [‘Android’]. Но я хочу все.

Мой запрос:

 SELECT robotAds."Ad_ID",
    ARRAY_AGG(DISTINCT quote_literal(robotSession."Session_OS"))
    as Session_OS
    FROM robot__ads robotAds LEFT JOIN
    robot__session__scraper__data robotScraper ON
    robotScraper."adIDAdID" = robotAds."Ad_ID" LEFT JOIN
    robot__session_data robotSession ON robotSession."id" = robotScraper."sessionIDId" WHERE
    robotScraper."sessionIDId" IS NOT NULL
    AND robotsession."Session_OS" IN ('Android')
    GROUP BY robotAds."Ad_ID"
 

В результате этого запроса «Session_OS» выдает только значение «Android».

И примерные данные этого запроса выглядят следующим образом:

   id   | Session_OS
-------|-------------
 641   | {'Android'}
 642   | {'Android'}
 643   | {'Android'}
 

Но я хочу, чтобы все значения, которые находятся В агрегации Session_Os, соответствовали какому-либо из них. как и здесь, в моем запросе, он совпадает с «Android»:

   id   | Session_OS
-------|-------------
 641   | {'Android, 'IOS'}
 642   | {'Android, 'Windows'}
 643   | {'Android', 'IOS', 'Windows'}
 

Как я могу этого добиться??

Обновить:

Полные данные, без этого условия в запросе AND robotsession."Session_OS" IN ('Android')

   id   | Session_OS
-------|-------------
 641   | {'Android, 'IOS'}
 642   | {'Android, 'Windows'}
 643   | {'Android', 'IOS', 'Windows'}
 644   | {'IOS', 'Windows'}
 645   | {'IOS'}
 

Но после добавления этого условия AND robotsession."Session_OS" IN ('Android') в результат запроса

    id  | Session_OS
-------|-------------
 641   | {'Android'}
 642   | {'Android'}
 643   | {'Android'}
 

Но я хочу этого. Как я могу это сделать?

   id   | Session_OS
-------|-------------
 641   | {'Android, 'IOS'}
 642   | {'Android, 'Windows'}
 643   | {'Android', 'IOS', 'Windows'}
 

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

1. a) Пожалуйста, сведите ваш пример кода к абсолютно необходимым частям, которые имеют отношение к описанию вашей проблемы. Т.е. Я думаю, нет необходимости показывать нам 3 или 4 соединения. б) Пожалуйста, добавьте некоторые примеры данных и ожидаемый результат, чтобы мы могли воспроизвести вашу проблему

2. Привет, спасибо за быстрый ответ. Я обновил свой вопрос. Пожалуйста, проверьте еще раз.

3. что такое quote_literal() . Пожалуйста, покажите данные перед группировкой

4. quote_literal() — это ничто. Вы можете игнорировать это. Это просто добавить кавычки («) к каждому значению.

5. Пожалуйста, проверьте обновленный вопрос.

Ответ №1:

демонстрация: db<>скрипка

 SELECT
    id,
    ARRAY_AGG(session_os)
FROM
    t
GROUP BY id
HAVING ARRAY_AGG(session_os) amp;amp; ARRAY['Android']
 

Ваша проблема заключается в том, что вы СНАЧАЛА фильтруете записи с session_os = Android помощью . И после этого вы объединяете их.

Сначала вам нужно выполнить агрегирование, а затем просмотреть агрегированный массив, если Android является элементом. Это можно сделать с помощью HAVING предложения и amp;amp; оператора, который возвращает true, если два массива содержат одинаковые элементы.

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

1. Привет, спасибо, это работает. Есть еще одна проблема. Что делать, если в ARRAY_AGG(session_os) есть нулевое значение?. Выдает ошибку. ОШИБКА: массив не должен содержать нулевые значения Состояние SQL: 22004

2. Привет, спасибо, что это работает. Есть еще одна проблема. Что делать, если в ARRAY_AGG(session_os) есть нулевое значение?. Выдает ошибку. ОШИБКА: массив не должен содержать нулевые значения Состояние SQL: 22004

3. Вы можете легко добавить фильтр «ГДЕ session_os НЕ РАВЕН нулю» перед группировкой: dbfiddle.uk /…

4. Почему это не позволяет мне также получать значения NULL? Если я использую «ГДЕ session_os РАВНО НУЛЮ» и ИМЕЮ ARRAY_AGG(session_os) amp;amp; ARRAY[‘Android’]. Это вызывает ту же ошибку. Я не могу этого сделать. Я не могу получить нулевые значения?

5. Смотрите это dbfiddle.uk /… . Мой случай такой… в этом случае я также могу получить нулевые значения.