これはsqlで実行できます 。 1つの方法は、join
できる整数のみの「ヘルパーテーブル」を使用することです。 データに対して、行を数回取得してから、n
だけを抽出します。 -番目のサブ要素。
これを試してください:
-- helper table with a listof integers from 1 to 10
create table _int_1_10 (id int primary key);
insert into _int_1_10 (id)
values (1), (2), (3), (4), (5), (6), (7), (8), (9), (10);
-- some example data
create table test_strexplode (
id int primary key,
space_value_1 varchar(200),
space_value_2 varchar(200)
);
insert into test_strexplode (id, space_value_1, space_value_2)
values (1, 'row 1', 'March 3,March 5,March 6 March 1,March 2 Feb 27'),
(2, 'row 2', 'March 3,,March 5'),
(3, 'row 3', '');
select space_value_1,
_int_1_10.id,
-- extracts the "_int_1_10.id"th element
SUBSTRING_INDEX(SUBSTRING_INDEX(
space_value_2,',',_int_1_10.id),',',-1) as subentry
from test_strexplode
join _int_1_10
on _int_1_10.id <=
-- number of elements in your string (= number of "," + 1)
char_length(space_value_2) - char_length(replace(space_value_2, ',', '')) + 1
order by test_strexplode.id, _int_1_10.id;
これにより、次のことが可能になります:
+---------------+----+-----------------+
| space_value_1 | id | subentry |
+---------------+----+-----------------+
| row 1 | 1 | March 3 |
| row 1 | 2 | March 5 |
| row 1 | 3 | March 6 March 1 |
| row 1 | 4 | March 2 Feb 27 |
| row 2 | 1 | March 3 |
| row 2 | 2 | |
| row 2 | 3 | March 5 |
| row 3 | 1 | |
+---------------+----+-----------------+
,
が欠落しているサンプルデータを使用しました 、これが結果に含まれる理由です。 March 2 Feb 27
。また、一部のサブエントリが空であることに注意してください(私のサンプルデータには空のエントリが含まれているため)。それらを除外する場合としない場合があります。整数テーブルには、少なくとも、行に含まれると予想される要素の最大数までの数値が含まれている必要があります(0
が含まれている場合)。 または負の数の場合は、on
で除外します -節)。
substring_index(str,delim,count)
文字列str
から部分文字列を返します count
の前 区切り文字delim
の出現 。 subentry
の完全なステートメント 正の数の場合、_int_1_10.id
のいずれかを返します -番目の要素、または文字列の要素が少ない場合は最後の要素。
on
-clauseは、要素の数を計算します(,
の数を数えることによって) )最後の要素を数回取得しないようにします。文字列に空の要素(,,
など)が含まれていない場合 私のサンプルデータでは)、その部分は必要ありませんが、リストの終わりを示すために空の要素を追加することができます。
このコードを結果セット全体に適用できます。を使用して
...
from (select ...
space1_1_value as space_value_1,
space1_2_value as space_value_2
...
union all ... union all ... ) as test_strexplode
join _int_1_10 ...
動作しますが、遅い場合があります。 space*_2_value
のインデックスは使用できません -列と多くの結合と文字列評価を行う必要があります。ただし、データを正規化する以外は、それについて多くのことを行うことはできません。
sqlでこれを行うと便利な場合 おそらく、データをどのように処理しているかによって異なります。 Webページのhtmlテーブルに表示するだけの場合は、 phpの配列をループするだけの方が簡単で高速な場合があります。 。並べ替え、フィルタリング、またはjoin
結果セットの場合、 sql での実装はおそらくはるかに簡単です(おそらく高速です)。 、おそらくフレームワークで使用している場合でも。値を更新する場合は、 phpで行う方がはるかに簡単です。 、 sqlで混乱する可能性が高いため (この結果セット上)