Ini dapat dilakukan di sql . Salah satu caranya adalah dengan menggunakan "tabel pembantu" hanya dengan bilangan bulat yang dapat Anda join
data Anda untuk mendapatkan baris Anda beberapa kali dan kemudian mengekstrak hanya n
- subelemen.
Coba ini:
-- 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;
Ini akan memberi Anda:
+---------------+----+-----------------+
| 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 | |
+---------------+----+-----------------+
Saya menggunakan data sampel Anda yang kehilangan beberapa ,
, itulah sebabnya hasilnya berisi mis. March 2 Feb 27
. Perhatikan juga bahwa beberapa subentri kosong (karena data sampel saya menyertakan entri kosong); Anda mungkin ingin atau tidak ingin memfilternya. Tabel integer Anda jelas harus berisi angka setidaknya hingga jumlah maksimum elemen yang Anda harapkan ada di salah satu baris Anda (dan jika berisi 0
atau angka negatif, saring di on
-klausa).
substring_index(str,delim,count)
mengembalikan substring dari string str
sebelum count
kemunculan pembatas delim
. Pernyataan lengkap untuk subentry
akan, untuk bilangan positif, mengembalikan _int_1_10.id
-th elemen atau, jika string memiliki lebih sedikit elemen, elemen terakhir.
on
-clause dengan demikian menghitung jumlah elemen (dengan menghitung jumlah ,
) untuk mencegah mendapatkan elemen terakhir beberapa kali. Jika string Anda tidak mengandung elemen kosong (seperti ,,
dalam data sampel saya), Anda tidak memerlukan bagian itu tetapi dapat menambahkan elemen kosong untuk menandai akhir daftar.
Anda dapat menerapkan kode ini ke seluruh hasil Anda, mis. dengan menggunakan
...
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 ...
Ini akan berhasil, tetapi mungkin lambat. Itu tidak dapat menggunakan indeks pada space*_2_value
-columns dan harus melakukan banyak penggabungan dan evaluasi string. Anda tidak dapat berbuat banyak, kecuali menormalkan data Anda.
Jika berguna untuk melakukan ini di sql mungkin akan tergantung pada apa yang Anda lakukan dengan data. Jika Anda hanya akan menampilkannya dalam tabel-html di halaman web, mungkin lebih mudah dan lebih cepat untuk hanya mengulang array di php . Untuk mengurutkan, memfilter, atau join
hasil Anda, mungkin jauh lebih mudah untuk diterapkan (dan kemungkinan lebih cepat) di sql , mungkin bahkan jika Anda menggunakannya dalam kerangka kerja. Jika Anda akan memperbarui nilainya, itu akan lebih mudah dilakukan di php , karena kemungkinan besar akan berantakan di sql (pada hasil ini).