无法返回Null所以我需要替换

时间:2013-05-30 21:24:00

标签: mysql

我有一个很好的疑问:

SELECT DISTINCT( p.id ), 
               p.last_name, 
               p.first_name,
               c.club_name, 
               c.join_date, 
               e.Full_name
FROM   people AS p, 
       club AS c, 
       employee AS e 
WHERE  c.people_id = p.id 
       AND p.id_ofproducer = e.id 
       AND size IN ( 'Large', 'Medium' ) 

它几乎完成了我的预期。希望改变这一点,以便获得大小为中等或大的所有记录,无论哪里有俱乐部(c)或EMployee(e)相关记录。

AND:我真的希望c.club_name,c.join_date和。或e.Full_name如果为NULL则返回“ - ”。

所以我的问题是双重的。

  1. 我的SQL / Join
  2. 出了什么问题
  3. 是否可以返回一个字符串来代替Null?

4 个答案:

答案 0 :(得分:2)

回答1:您的加入是INNER JOIN,这意味着它必须在两个表中,您需要切换到LEFT JOIN
回答2:是,使用IFNULL(c.club_name,'--')COALESCE(c.club_name,'--')

SELECT DISTINCT( p.id ), 
               p.last_name, 
               p.first_name,
               IFNULL(c.club_name,'--') AS club_name, 
               IFNULL(c.join_date,'--') AS join_date, 
               IFNULL(e.Full_name,'--') AS Full_name
FROM   people AS p, 
       LEFT JOIN club AS c ON c.people_id = p.id
       LEFT JOIN employee AS e ON p.id_ofproducer = e.id 
WHERE  size IN ( 'Large', 'Medium' ) 

答案 1 :(得分:1)

您加入的问题是INNER加入,您需要LEFT加入。此外,最好使用ANSI连接语法,而不是在WHERE子句中隐藏连接条件。

至于将NULL转换为字符串,请使用MySQL Coalesce function

新查询看起来像这样:

SELECT DISTINCT( p.id ), 
           p.last_name, 
           p.first_name,
           COALESCE(c.club_name, '---'),
           COALESCE(c.join_date, '---'),
           COALESCE(e.Full_name, '---')
FROM   people AS p
LEFT JOIN club c ON p.id = c.people_id
LEFT JOIN employee e ON p.id_ofproducer = e.id
WHERE size IN ('Large', 'Medium')

我不太确定DISTINCT(p.id)发生了什么事,但如果它正在做的事情对你有用,那么一切都很好。

答案 2 :(得分:0)

使用加入和ifnull()

SELECT DISTINCT p.id, 
       p.last_name, 
       p.first_name,
       ifnull(c.club_name, '--') club_name, 
       ifnull(c.join_date, '--') join_date,
       ifnull(e.Full_name, '--') Full_name
FROM  people p
LEFT JOIN 0club c c.people_id = p.id 
LEFT JOIN employee e ON p.id_ofproducer = e.id 
WHERE size IN ( 'Large', 'Medium' ) 

答案 3 :(得分:0)

1. Use LEFT OUTER JOIN
2. Use ifnull() function

    SELECT DISTINCT( p.id ), 
                       p.last_name, 
                       p.first_name,
                       ifnull(c.club_name, '--') as club_name,
                       ifnull(c.join_date, '--') as join_date,
                       ifnull(e.Full_name, '--') as Full_name
        FROM   people AS p 
        LEFT OUTER JOIN club AS c ON c.people_id = p.id 
        LEFT OUTER JOIN employee AS e ON p.id_ofproducer = e.id
        WHERE  size IN ( 'Large', 'Medium' )