यह sql . में किया जा सकता है . एक तरीका यह होगा कि आप केवल पूर्णांकों के साथ "सहायक तालिका" का उपयोग करें जिससे आप 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
-क्लॉज इस प्रकार तत्वों की संख्या की गणना करता है (,
. की संख्या की गणना करके) ) अंतिम तत्व को कई बार प्राप्त करने से रोकने के लिए। यदि आपकी स्ट्रिंग में कोई खाली तत्व नहीं है (जैसे ,,
मेरे नमूना डेटा में), आपको उस हिस्से की आवश्यकता नहीं है, लेकिन सूची के अंत को चिह्नित करने के लिए एक खाली तत्व जोड़ सकते हैं।
आप इस कोड को अपने संपूर्ण परिणाम सेट पर लागू कर सकते हैं उदा।
. का उपयोग करके...
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 . में ऐसा करना उपयोगी है शायद आप डेटा के साथ क्या कर रहे हैं इस पर निर्भर करेगा। यदि आप इसे किसी वेबपृष्ठ पर HTML-तालिका में प्रदर्शित करने जा रहे हैं, तो php में सरणी के माध्यम से लूप करना आसान और तेज़ दोनों हो सकता है . सॉर्ट करने के लिए, फ़िल्टर करें या join
आपका परिणाम सेट, sql . में लागू करना (और संभवतः तेज़) करना शायद बहुत आसान है , हो सकता है कि आप इसे किसी ढांचे में उपयोग कर रहे हों। यदि आप मानों को अपडेट करने जा रहे हैं, तो php . में करना बहुत आसान हो जाएगा , क्योंकि इससे sql . में गड़बड़ी होने की सबसे अधिक संभावना है (इस परिणामसेट पर)।