我有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并将它们加入到那里?)
原来我得到了一个NULL; PHP同样处理返回的NULL和空字符串(“”),您必须与===进行比较以查看差异。
答案 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