Подзапрос существует - возвращение одного столбца - PullRequest
1 голос
/ 12 апреля 2019

Мой запрос:

SELECT EXISTS (SELECT votes FROM voted WHERE id = $1 AND user_id = $6),
    EXISTS (SELECT votes FROM voted WHERE id = $2 AND user_id = $6),
    EXISTS (SELECT votes FROM voted WHERE id = $3 AND user_id = $6),
    EXISTS (SELECT votes FROM voted WHERE id = $4 AND user_id = $6),
    EXISTS (SELECT votes FROM voted WHERE id = $5 AND user_id = $6);

возвращает 5 столбцов false | ложь | ложь | ложь | ложь

https://imgur.com/a/XdI9gKF

Как бы я сделал их в один столбец? Я использую заказ?

Причина этого в том, что когда я возвращаю запрос в AWS Lamba / CloudWatch, он дает мне только первое значение строки (1 ложное значение), а не все 5 значений.

https://imgur.com/a/MaZa41k

EDIT1: __________________________________________________________________

У меня есть массив из 5 значений [postId1, postId2, postId3, postId4, postId5]

Я хочу проверить мою таблицу «голоса», если она содержит каждое значение массива.

Вот почему я использую пять запросов "EXIST" выше. Сам запрос отлично работает в pgadmin и возвращает пять ложных значений.

https://imgur.com/a/XdI9gKF

Однако в AWS Cloudwatch он возвращает только 1 столбец (1 значение false)

https://imgur.com/a/MaZa41k

Здесь я не уверен, в чем проблема. Это потому, что nodejs-postgres не позволяет использовать несколько операторов SELECT в одном запросе?

По сути, это моя конечная цель для AWS Lambda - вернуть пять «ложных» значений.

"rows": [
     {
       "exists": false
     {,
     {
       "exists": false
     {,
     {
       "exists": false
     {,
     {
       "exists": false
     {,
     {
       "exists": false
     {
  ]


Ответы [ 2 ]

0 голосов
/ 12 апреля 2019

Если вам нужен один столбец, вы можете превратить результат в значение JSON, которое содержит пары ключ / значение для идентификаторов, которые нужно протестировать:

select jsonb_object_agg(t.id::text, coalesce(t.id = v.id, false)) as result
from unnest(array[$1,$2,$3,$4,$5]) as t(id)
  left join voted v on t.id = v.id and v.user_id = $6;

array[...] содержит значения идентификаторов, которые вы хотите проверить.

coalesce(t.id = v.id, false) также можно записать как t.id is not distinct from v.id, чтобы правильно обрабатывать пропущенные значения идентификатора.

Результатом будет значение JSON, которое содержит значения идентификатора в качестве ключей и значение true / false, если идентификатор присутствовал в таблице, например,

{"5": true, "8": false, "10": false, "11": false, "22": false, "42": false, "100": false}

Если ваше приложение может обрабатывать JSON, то это гораздо более гибко, чем ваш подход, поскольку он легко масштабируется до большего числа значений.

0 голосов
/ 12 апреля 2019

вы можете сделать это следующим образом

select 
to_jsonb(array_agg(main)) as "rows"

      from (SELECT EXISTS (SELECT votes FROM voted WHERE id = $1 AND user_id = $6) as a,
        EXISTS (SELECT votes FROM voted WHERE id = $2 AND user_id = $6) as b,
        EXISTS (SELECT votes FROM voted WHERE id = $3 AND user_id = $6) as c,
        EXISTS (SELECT votes FROM voted WHERE id = $4 AND user_id = $6) as d,
        EXISTS (SELECT votes FROM voted WHERE id = $5 AND user_id = $6) as e) as main;   

Таким образом, он вернется

rows
----------------------
[{"a": false, "b": false, "c": false, "d":false, "e":false}]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...