如何检查JOIN的结果是否为NULL?

时间:2017-07-11 04:39:45

标签: mysql sql null concat

这是我的表结构:

-- categories
+----+-------------+
| id |     name    |
+----+-------------+
| 1  | political   |
| 2  | cultural    |
| 3  | social      |
| 4  | historical  |
+----+-------------+

-- tags
+----+-------------+-----------+-------------+-----------------+
| id |     name    | parent_id | category_id |  total_used_num |
+----+-------------+-----------+-------------+-----------------+
| 1  | president   | NULL      | 1           | 43              |
| 2  | society     | NULL      | 3           | 345             |
| 3  | Trump       | 1         | 1           | 5               |
| 4  | book        | 5         | 2           | 5473            |
| 5  | library     | NULL      | 2           | 433             |
+----+-------------+-----------+-------------+-----------------+

这是我的疑问:

SELECT t1.name, 
       CONCAT(t2.name, ',', cat.name) t_p 
FROM   tags t1 
       LEFT JOIN tags t2 
              ON t1.parent_id = t2.id 
       INNER JOIN categories cat 
               ON t1.category_id = cat.id 
ORDER  BY total_used_num DESC, 
          t1.id 

/* output
+----+-------------+--------------------------+
| 1  | president   | NULL                     |
| 2  | society     | NULL                     |
| 3  | Trump       | president,political      |
| 4  | book        | library,cultural         |
| 5  | library     | NULL                     |
+----+-------------+--------------------------+

请参阅? CONCATNULL的结果为NULL。无论如何,我怎么能避免这种情况?另外,我想让逗号,有条件。如果两个字段都不是NULL,则该逗号应该在那里。这是预期结果

+----+-------------+--------------------------+
| 1  | president   | political                |
| 2  | society     | social                   |
| 3  | Trump       | president,political      |
| 4  | book        | library,cultural         |
| 5  | library     | cultural                 |
+----+-------------+--------------------------+

我该怎么做?

3 个答案:

答案 0 :(得分:2)

只需使用concat_ws()

SELECT t1.name, 
       CONCAT_WS(',', t2.name, cat.name) as t_p 
FROM tags t1 LEFT JOIN
     tags t2 
     ON t1.parent_id = t2.id INNER JOIN
     categories cat 
     ON t1.category_id = cat.id 
ORDER BY total_used_num DESC, t1.id ;

答案 1 :(得分:0)

您可以使用案例陈述。这是Oracle查询,您可以为MySQL修改它:

SELECT   t1.name, 
            (case when t2.name is not null then ( t2.name || ', ') else '' end)  || cat.name 
FROM   tags t1 
       LEFT JOIN tags t2 
              ON t1.parent_id = t2.id 
       INNER JOIN categories cat 
               ON t1.category_id = cat.id  
ORDER  BY t1.total_used_num DESC, 
          t1.id ;

答案 2 :(得分:0)

只需使用CASE WHEN语句,即可获得预期的输出。 请参阅以下代码。

{{1}}