2012-02-06 82 views
0

我正在动态建立一个具有多个字段和不同分隔符的MySQL连接。如果当前连接字段为空或为空,我想删除分隔符。MySQL与不同分隔符的多个级联 - CONCAT_WS

$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像NULLIF(FIELD1, '')除掉多余的缀的?

有没有更快的功能来完成这个?

回答

0

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

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

,只需将其转换为空的飞行,并从内部查询您的选择。

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

CONCAT_WS(a, CONCAT_WS(c, d)) 

使用

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

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