我正在使用多个字段和不同的分隔符动态构建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中会除去额外的中缀吗?
是否有更快的功能来实现这一目标?
答案 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子句的一部分时,这才有可能。