在SQL中显示两个表的列不为空

时间:2014-09-04 09:56:33

标签: mysql sql if-statement case inner-join

我想连接两个表,如果第一个为空,则从第一个列中选择第二个列,如果第一个为空,则选择另一个列。举一个例子,假设我们有以下表格:

names                                    companies_to_names
--------------------------------        -----------------------------
|id_name | name    | nickname  |        | id | id_name | id_company |
--------------------------------        -----------------------------
|   1    | NULL    | manu      |        | 1  |   1     |     1      |
|   2    | Joe A.  | NULL      |        | 2  |   2     |     1      |
|   3    | Bob B.  | NULL      |        | 3  |   3     |     1      |
|   4    | NULL    | alice     |        | 4  |   4     |     1      |
|   5    | NULL    | other     |        | 5  |   5     |     2      |
--------------------------------        -----------------------------

我们想要显示为id = 1的公司工作的人的名字或昵称。然后,我想要以下结果:

--------------------
|id_name | username|
--------------------
|   1    | manu    |
|   2    | Joe A.  |
|   3    | Bob B.  |
|   4    | alice   |
--------------------

我在SELECT CASE WHEN中思考,但我不知道该怎么做。类似的东西:

SELECT NAMES.id_name CASE username
  WHEN NAMES.name IS NULL THEN NAMES.nickname
  WHEN NAMES.name IS NOT NULL THEN NAMES.name
  END
FROM NAMES INNER JOIN COMPANIES_TO_NAMES ON NAMES.id_name = COMPANIES_TO_NAMES.id_name;

我是对的吗?

1 个答案:

答案 0 :(得分:1)

以下是一个询问您如何解决问题的查询:

SELECT N.id_name
    ,IFNULL(N.name, N.nickname) AS [username]
    ,CASE
      WHEN N.name IS NOT NULL THEN 'name'
      ELSE 'nickname'
    END AS [username_source]
FROM NAMES N
INNER JOIN companies_to_names C ON C.id_name = N.id_name
                                 AND C.id = 1

希望这会对你有所帮助。