使用不同分隔符的MySQL多个连接 - CONCAT_WS

时间:2012-02-06 18:42:13

标签: mysql null field concatenation separator

我正在使用多个字段和不同的分隔符动态构建MySQL连接。如果当前连接的字段为空或空,我想删除分隔符。

$concat_string = "CONCAT_WS('".$infix_array[0]."'," . $concat_fields_array[0] . "," . $concat_fields_array[1] . ")";
$i = 0;
foreach($concat_fields_array as $concat_field){
    if($i >= 2){
         $concat_string = "CONCAT_WS('".$infix_array[$i-1]."'," . $concat_string . "," . $concat_field . ")";
    }
    $i++;
}

这构建了一个嵌套的CONCAT_WS,如:

 CONCAT_WS(', ',CONCAT_WS(' - ',CONCAT_WS(':',CONCAT_WS(' ',field1,field2),field3),field4),field5)

将NULLIF(field1,'')中的字段包装在NULLIF中会除去额外的中缀吗?

是否有更快的功能来实现这一目标?

1 个答案:

答案 0 :(得分:0)

NULL字段没有问题,因为CONCAT_WS将跳过NULL值(与分隔符一起)。关于空字符串(不会被跳过),您可以在执行此操作之前将它们转换为NULL。如果您无法更新数据库本身,请进行如下查询:

select <your expression> from (select case when col1 = '' then null else col1 end as col1 from my_table);

所以,只需动态将其转换为null,然后从该内部查询中进行选择。

为了使这项工作,你将不得不使用nullif,所以而不是:

CONCAT_WS(a, CONCAT_WS(c, d))

使用

NULLIF(CONCAT_WS(a, NULLIF(CONCAT_WS(c, d), '')), '')

我认为你不会找到更快的方法。另一种选择可能是只选择那些字段,然后在PHP端进行连接,但只有当你的结果连接不是查询中某些WHERE子句的一部分时,这才有可能。