2012-02-06 14 views
0

複数のフィールドと異なる区切り文字を使用してMySQL連結を動的に構築しています。現在連結されているフィールドが空白またはnullの場合、区切り記号を削除したいと思います。複数の区切り文字を使用した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構築します。NULLIF(フィールド1、 '')のようなNULLIFのフィールドを包むだろうが余分に挿入辞を取り除く

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

を?

これを達成するためのより高速な機能はありますか?

答えて

0

CONCAT_WSは(セパレータとともに)NULL値をスキップするため、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句の一部ではない場合にのみ可能です。