PostgreSQL - в функции массива - PullRequest
0 голосов
/ 16 января 2011

Я вернул записи в форме:

id, group_name, {user_groupid1, user_groupid2, ...,  user_groupidn}

Запрос возвращает все группы в системе плюс я хочу вернуть в том же наборе результатов, принадлежит ли пользователь группе или нет.

Сначала я попытался использовать подзапрос в операторе select, чтобы установить для третьего столбца логическое значение, и это работало как шарм, но большая проблема заключается в том, что я использую Java + Hibernate и Hibernate не будет работать с подзапросами в selectзаявления, если вы хотите передать результат в конструктор (и это именно то, что я хочу).Поэтому я решил использовать функцию SQL, где есть 2 параметра, первый - это идентификатор (длинный), второй - массив или набор идентификаторов, и я хотел бы знать, содержится ли идентификатор в наборе илине.В приведенном выше примере я использовал функцию array_agg, поэтому она объединяет данные идентификаторы в массив, но это не обязательно та форма, которой должен быть 2-й параметр.Это просто набор идентификаторов.

До этого я пришел к идее решить эту проблему в SQL, я возвратил идентификаторы в виде массива String выше, затем я обработал его в Java (разбиение, анализ) и я неэто действительно так, поэтому мне нужно другое решение.

Любая помощь приветствуется!

ура,

b

1 Ответ

1 голос
/ 16 января 2011

Этот второй комментарий заставил меня понять, что вы хотите;)

Вы на правильном пути:

SELECT g.id,
       g.name,
       (SELECT COUNT(*)
        FROM usergroupcontact ug2
        WHERE ug2.group_id = g.id
        AND   ug2.user_id = :user_id) as user_is_member
FROM group_ g
WHERE g.name LIKE '%:name%';

Это даст вам 0 в столбце user_is_member, если пользователь не является частью этой группы, или 1, если этот пользователь является частью группы.

(обратите внимание, я использовал group_ в качестве имени таблицы, чтобы избежать использования зарезервированных слов)

Редактировать
Если вы хотите получить список всех пользователей и групп и проверить, является ли пользователь членом группы, вам может потребоваться следующее:

SELECT u.id AS user_id,
       u.name AS user_name,
       g.id AS group_id,
       g.name AS group_name,
       CASE
         WHEN ug.id IS NULL THEN 'not member'
         ELSE 'member'
       END AS is_member
FROM user_ u 
  CROSS JOIN group_ g 
  LEFT JOIN usergroupcontact ug ON ug.user_id = u.id AND ug.group_id = g.id; 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...