在连接期间,NULL值将所有内容都转换为NULL

时间:2013-04-08 14:16:11

标签: mysql sql concatenation

我正在使用的DBMS是MySQL。

这是表格:

                    AUTHOR
author_id | first_name | last_name | patronymic
-----------------------------------------------
     1    | John       | Bush      | NULL
     2    | Sergey     | Burov     | Romanovich
     3    | NULL       | Filin     | NULL

如果我发出此查询:

SELECT author_id,
       CONCAT(first_name, ' ', last_name,  ' ', patronymic) AS full_name
FROM   author;

输出如下:

author_id | full_name
-----------------------------------
     1    | NULL
     2    | Sergey Burov Romanovich
     3    | NULL

因此,从示例中可以看出,如果字段具有NULL值,则在连接过程中,整个事物将设置为NULL。请解释一下,如何让MySQL将NULL值转换为长度为0的字符串,或者只是使它不会连接NULL值?

提前谢谢大家。

4 个答案:

答案 0 :(得分:5)

您可以使用CONCAT_WS使用分隔符连接字符串,并跳过空值:

SELECT author_id,
       CONCAT_WS(' ', first_name, last_name,  patronymic) AS full_name
FROM   author;

请参阅小提琴here

答案 1 :(得分:0)

这是直接回答您问题的方法:

SELECT author_id,
       CONCAT(ISNULL(first_name,''), ' ', 
              ISNULL(last_name,''),  ' ',
              ISNULL(patronymic,'')) AS full_name
FROM author;

甚至是这个(用空中间名解决了双空格问题):

SELECT author_id,
       CONCAT(ISNULL(CONCAT(first_name,' '),''), 
              ISNULL(CONCAT(last_name,' '),''),
              ISNULL(patronymic,'')) AS full_name
FROM author;

但这将回答真正的问题 - 在这个或稍微复杂的情况下做好格式化的最佳解决方案:

FirstName, LastName in SQL, too complex?

答案 2 :(得分:0)

在所有列上使用COALESCE以保证它们永远不会返回null(通过返回值或空字符串)

答案 3 :(得分:0)

SELECT author_id,
   CONCAT(ifnull(first_name,''), ' ', ifnull(last_name,''),  ' ', ifnull(patronymic,'')) AS full_name FROM   author;