如果不是NULL则选择列,然后选择其他

时间:2012-03-05 14:22:51

标签: mysql join

我正在尝试计算在使用JOIN语法时如何返回带有关联值的行,首先应检查links表以查看该行是否为NULL,如果不是NULLJOIN用于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表返回相关值,因此它应该依赖links.role_id表格优先,检查NULL是否为people.role_id,然后为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 ) ,例如(伪代码):

{{1}}

2 个答案:

答案 0 :(得分:3)

可以IF(links.role_id IS NOT NULL, links.role_id, people.role_id) - 这是你的伪代码最接近的东西 - 但是写COALESCE(links.role_id, people.role_id)更加惯用。

有关IF的信息,请参阅§11.4 "Control Flow Functions" in the MySQL Reference Manual;有关COALESCE的信息,请参阅§11.3.2 "Comparison Functions and Operators"

答案 1 :(得分:0)

我认为代码清晰度我会有两个角色加入。一个来自角色,一个来自人与角色。即。

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
)