MySQL返回一个空字段:CONCAT(nonEmpty1,empty2,nonEmpty3)= NULL

时间:2009-06-11 13:52:51

标签: mysql null

我有PHP 5代码访问MySQL 5服务器上的MyISAM表。查询如下所示:

SELECT CONCAT(fName1,' ',mName2,' ',lName3) AS userName 
    FROM users 
    WHERE level > 10

如果没有填写mName,我希望输出像“fname lname”,但我得到“”(空字符串)而不是(返回的行数是正确的)。我哪里弄错了?

PHP代码:

<?php
$result = mysql_query($the_above_query);
while ($result_row = mysql_fetch_assoc($result)) {
    // do stuff with the name
    // except I'm getting empty strings in $result_row['userName']
}

表结构的相关部分:

CREATE TABLE users {
    /* -snip- */ 
    `fName1` varchar(50) default NULL,      
    `mName2` varchar(50) default NULL,      
    `lName3` varchar(50) default NULL,      
    `level` int(11) default 0,      
    /* -snip- */ 
} ENGINE=MyISAM DEFAULT CHARSET=utf8;

(同样,这种方式(MySQL中的列连接)是一个好主意,还是应该将列提取到PHP并将它们加入到那里?)


原来我得到了一个N​​ULL; PHP同样处理返回的NULL和空字符串(“”),您必须与===进行比较以查看差异。

6 个答案:

答案 0 :(得分:25)

来自谷歌:http://bugs.mysql.com/bug.php?id=480

[2003年5月23日4:32] Alexander Keremidarski

感谢您抽出宝贵时间给我们写信,但事实并非如此 一个bug。请仔细检查可用的文档 http://www.mysql.com/documentation/以及有关的说明 如何在http://bugs.mysql.com/how-to-report.php

报告错误

这是CONCAT()函数的记录行为。

从手册章节6.3.2字符串函数

CONCAT(STR1,STR2,...) 返回连接参数产生的字符串。如果有的话返回NULL 参数为NULL

改为使用CONCAT_WS()或使用IFNULL()函数包装NULLable参数。

CONCAT_WS的文档和用法:http://dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_concat-ws

答案 1 :(得分:16)

来自MYSQL文档

  

如果有任何参数,CONCAT()将返回NULL   是NULL。

你想使用CONCAT_WS()

CONCAT_WS(separator,str1,str2,...)

但最好的办法是将其拉回来并使用php原因如果你需要一个不同的格式或者只是其中一个字段,你将不得不进行另一个db调用

答案 2 :(得分:11)

在MySQL中将任何字符串连接到NULL值会导致NULL。 在使用IFNULL连接之前,您必须检查NULL:

SELECT CONCAT(IFNULL(fName1,''),' ',IFNULL(mName2,''),' ',IFNULL(lName3,'')) AS userName 
FROM users 
WHERE level > 10

答案 3 :(得分:3)

这是我提出的解决方案,其中包括Keeper和Ersatz的回答。系统不允许我投票给你们:(

CONCAT_WS(IFNULL(ts_usr_nameDetails.first_name,''),' ',IFNULL(ts_usr_lib_connectionNameDetails.first_name,'')) AS composerName

这可以带来一些惊人的结果

答案 4 :(得分:1)

这是基于@chocojosh的上述解决方案和另一个问题的答案:MySQL/SQL: Update with correlated subquery from the updated table itself

我有类似的问题,但我试图连接一堆group_concats,有些是NULL,导致整行为NULL。目标是将其他表中的数据放入主表中的单个字段,以允许全文搜索。

这是有效的SQL。请注意我创建的concat_ws的第一个参数'',这允许在fulltext字段的值之间留出空格。

希望这有助于某人。

update
products target
INNER JOIN 
(
    select p.id, 
    CONCAT_WS(
    ' ',
        (select GROUP_CONCAT(field SEPARATOR ' ') from table1 where productId = p.id),
        p.title,' ', 
        (select GROUP_CONCAT(field, ' ', descriptions SEPARATOR ' ') from table2 where productId = p.id),
        (select GROUP_CONCAT(field SEPARATOR ' ') from table3 where productId = p.id),
        (select GROUP_CONCAT(field, ' ', catno SEPARATOR ' ') from table4 where productId = p.id),
        (select GROUP_CONCAT(field SEPARATOR ' ') from table5 where productId = p.id),
        (select GROUP_CONCAT(field SEPARATOR ' ') from table6 where productId = p.id),
        (select GROUP_CONCAT(field SEPARATOR ' ') from table7 where productId = p.id)
    ) as ft
    from products p
) as source
on target.id = source.id
set target.fulltextsearch = source.ft

答案 5 :(得分:1)

您还可以使用COALESCE()函数返回第一个非空值。像这样:

SELECT CONCAT(fName1,COALESCE(CONCAT(' ',mName2,' '),' '),lName3) AS userName 
  FROM users 
  WHERE level > 10

如果中间名称之前和之后没有中间名和空格,这也只会放一个空格。

此功能的参考资料可在以下网址找到:http://dev.mysql.com/doc/refman/5.0/en/comparison-operators.html#function_coalesce