Выберите столбец, если не NULL, затем выберите другой - PullRequest
1 голос
/ 05 марта 2012

Я пытаюсь понять, как вернуть строку со связанным значением при использовании синтаксиса JOIN, во-первых, следует проверить таблицу links, чтобы увидеть, является ли строка NULL, если она не NULL, используйте что за JOIN например ON links.role_id = roles.role_id, если строка NULl. Если это NULL, тогда используйте таблицу people.

Мой синтаксис:

SELECT roles.role_name
FROM
(
    people_links links

    LEFT OUTER JOIN people people ON links.person_id = people.person_id

    LEFT OUTER JOIN roles roles ON links.role_id = roles.role_id OR links.role_id = people.role_id
)

По сути, при объединении и использовании синтаксиса ON с role_id он возвращает соответствующее значение из таблицы roles, которая используется из role_id, поэтому он должен опираться на таблицу links first , проверьте, если links.role_id равно NULL, затем верните people.role_id else links.role_id для JOIN, чтобы получить role_name.

Когда я запускаю этот запрос, он сначала использует role_id из таблицы people, когда он должен сначала смотреть в таблицу links.

Я попытался использовать COALESCE, но он вернет role_id только тогда, когда он должен вернуть role_name, например, (псевдокод):

SELECT IF(links.role_id IS NOT NULL) links.role_id ELSE people.role_id ENDIF as join_value
FROM
(
    people_links links

    LEFT OUTER JOIN people people ON links.person_id = people.person_id

    LEFT OUTER JOIN roles roles ON roles.role_id = join_value
)

Ответы [ 2 ]

3 голосов
/ 05 марта 2012

Вы могли бы написать IF(links.role_id IS NOT NULL, links.role_id, people.role_id) & mdash; это самая близкая вещь к вашему псевдокоду & mdash; но более идиоматично писать COALESCE(links.role_id, people.role_id).

Информацию о IF см. В и раздел 11.4 «Функции потока управления» в Справочном руководстве MySQL ; для получения информации о COALESCE см. & 11.3.2 «Функции сравнения и операторы» .

0 голосов
/ 05 марта 2012

Я думаю, для ясности кода, у меня будет два соединения на роль. Один от ссылки на роль и один от людей на роль. * 1001 Т.е. *

SELECT
COALESCE(links_roles.role_name, people_roles.role_name)
FROM
(
    people_links links

    LEFT OUTER JOIN people people ON links.person_id = people.person_id

    LEFT OUTER JOIN roles link_roles ON links.role_id = link_roles.role_id

    LEFT OUTER JOIN roles people_roles ON people.role_id = people_roles.role_id
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...