MySQL में SUBSTRING_INDEX का उपयोग करके विभाजक द्वारा स्ट्रिंग पार्सिंग
MySQL का SUBSTRING_INDEX() फ़ंक्शन एक स्ट्रिंग को विभाजक द्वारा विभाजित करने और विशिष्ट भाग निकालने के लिए अत्यंत उपयोगी है। यह CSV-शैली डेटा या संयुक्त फ़ील्ड्स को पार्स करने के लिए आदर्श है।
टेबल बनाना
mysql> CREATE TABLE DemoTable1962 (
-> EmployeeInformation TEXT
-> );
Query OK, 0 rows affected (0.00 sec)
डेटा डालना (हाइफ़न से अलग मान)
mysql> INSERT INTO DemoTable1962 VALUES ('101-John-29');
Query OK, 1 row affected (0.00 sec)
mysql> INSERT INTO DemoTable1962 VALUES ('102-David-35');
Query OK, 1 row affected (0.00 sec)
mysql> INSERT INTO DemoTable1962 VALUES ('103-Chris-28');
Query OK, 1 row affected (0.00 sec)
मूल डेटा
mysql> SELECT * FROM DemoTable1962;
+---------------------+
| EmployeeInformation |
+---------------------+
| 101-John-29 |
| 102-David-35 |
| 103-Chris-28 |
+---------------------+
3 rows in set (0.00 sec)
स्ट्रिंग को तीन कॉलम्स में विभाजित करने का क्वेरी
mysql> SELECT
-> SUBSTRING_INDEX(EmployeeInformation, '-', 1) AS EmployeeId,
-> SUBSTRING_INDEX(SUBSTRING_INDEX(EmployeeInformation, '-', 2), '-', -1) AS EmployeeName,
-> SUBSTRING_INDEX(SUBSTRING_INDEX(EmployeeInformation, '-', -2), '-', -1) AS EmployeeAge
-> FROM DemoTable1962;
परिणाम
+------------+--------------+-------------+
| EmployeeId | EmployeeName | EmployeeAge |
+------------+--------------+-------------+
| 101 | John | 29 |
| 102 | David | 35 |
| 103 | Chris | 28 |
+------------+--------------+-------------+
3 rows in set (0.00 sec)
SUBSTRING_INDEX सिंटैक्स और तर्क
SUBSTRING_INDEX(str, delim, count)
- str: स्रोत स्ट्रिंग
- delim: विभाजक स्ट्रिंग
- count:
- धनात्मक: बाएं से count-वें विभाजक से पहले का सबस्ट्रिंग
- ऋणात्मक: दाएं से |count|-वें विभाजक के बाद का सबस्ट्रिंग
चरण-दर-चरण विश्लेषण
1. पहला भाग (EmployeeId): विभाजक से पहले
SUBSTRING_INDEX('101-John-29', '-', 1)
-- पहला '-' से पहले: '101'
2. दूसरा भाग (EmployeeName): पहले और दूसरे विभाजक के बीच
-- चरण 1: पहले 2 विभाजकों तक: '101-John'
SUBSTRING_INDEX('101-John-29', '-', 2) -- '101-John'
-- चरण 2: परिणाम से अंतिम भाग: 'John'
SUBSTRING_INDEX('101-John', '-', -1) -- 'John'
-- संयुक्त:
SUBSTRING_INDEX(SUBSTRING_INDEX(str, '-', 2), '-', -1)
3. तीसरा भाग (EmployeeAge): अंतिम विभाजक के बाद
-- अंतिम 2 विभाजकों से: 'John-29'
SUBSTRING_INDEX('101-John-29', '-', -2) -- 'John-29'
-- उसके बाद अंतिम भाग: '29'
SUBSTRING_INDEX('John-29', '-', -1) -- '29'
-- संयुक्त:
SUBSTRING_INDEX(SUBSTRING_INDEX(str, '-', -2), '-', -1)
सामान्य पैटर्न: N-वां भाग निकालना
-- 1ला भाग (पहले विभाजक से पहले)
SUBSTRING_INDEX(str, delim, 1)
-- N-वां भाग (1-आधारित)
SUBSTRING_INDEX(SUBSTRING_INDEX(str, delim, n), delim, -1)
-- अंतिम भाग
SUBSTRING_INDEX(str, delim, -1)
-- अंत से N-वां भाग
SUBSTRING_INDEX(SUBSTRING_INDEX(str, delim, -n), delim, 1)
MySQL 8.0+ विकल्प: JSON_TABLE
SELECT
jt.id, jt.name, jt.age
FROM DemoTable1962,
JSON_TABLE(
CONCAT('["', REPLACE(EmployeeInformation, '-', '","'), '"]'),
"$[*]" COLUMNS (
id VARCHAR(10) PATH "$[0]",
name VARCHAR(20) PATH "$[1]",
age INT PATH "$[2]"
)
) AS jt;
सामान्य विभाजक
| विभाजक | उपयोग मामला |
|---|---|
| , | CSV डेटा |
| | | पाइप-अलग |
| ; | अर्धविराम-अलग |
| : | समय, कुंजी-मान |
| \t | टैब-अलग (CHAR(9)) |
प्रदर्शन विचार
SUBSTRING_INDEXस्ट्रिंग फ़ंक्शन है - बड़े डेटासेट पर धीमा हो सकता है- बार-बार पार्सिंग के लिए, सामान्यीकृत कॉलम्स या गणना कॉलम्स पर विचार करें
- MySQL 8.0+:
GENERATED ALWAYS AS (SUBSTRING_INDEX(...)) STORED
डेटा प्रकार रूपांतरण
निकाले गए भाग स्ट्रिंग हैं। संख्यात्मक तुलना/गणना के लिए कास्ट करें:
SELECT
CAST(SUBSTRING_INDEX(EmployeeInformation, '-', 1) AS UNSIGNED) AS EmployeeId,
SUBSTRING_INDEX(SUBSTRING_INDEX(EmployeeInformation, '-', 2), '-', -1) AS EmployeeName,
CAST(SUBSTRING_INDEX(SUBSTRING_INDEX(EmployeeInformation, '-', -2), '-', -1) AS UNSIGNED) AS EmployeeAge
FROM DemoTable1962;