Computer >> कंप्यूटर ट्यूटोरियल >  >> प्रोग्रामिंग >> MySQL

MySQL में SUBSTRING_INDEX का उपयोग करके हाइफ़न से अलग स्ट्रिंग को कई कॉलम्स में विभाजित करें

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;
  1. - MySQL में अलग कॉलम वाली टेबल में रिकॉर्ड कैसे कॉपी करें?

    MySQL में एक टेबल से दूसरी टेबल में डेटा कॉपी करने के लिए, जब कॉलम नाम या संरचना अलग हो, तो INSERT INTO ... SELECT स्टेटमेंट का उपयोग करें। यह कॉलम मैपिंग को स्पष्ट रूप से परिभाषित करने की अनुमति देता है। उदाहरण: अलग कॉलम नामों के साथ डेटा कॉपी स्रोत टेबल बनाएं (ऑटो-इन्क्रीमेंट प्राइमरी की के साथ)

  1. - MySQL में दो कॉलम के मान गिनें और NULL को बाहर रखें

    COUNT() फ़ंक्शन से NULL मानों को छोड़कर कॉलम मान गिनना COUNT(कॉलम_नाम) स्वचालित रूप से NULL मानों को अनदेखा करता है। दो कॉलम के गैर-NULL मानों का कुल योग पाने के लिए दोनों COUNT को जोड़ें। टेबल बनाएं और डेटा डालें: mysql> create table DemoTable1975 ( StudentName varchar(20), StudentMarks int ); Q

  1. - MySQL में स्ट्रिंग कॉलम (स्ट्रिंग, संख्या, विशेष वर्ण) से विशिष्ट रिकॉर्ड प्राप्त करें

    CAST और SUBSTRING से संख्यात्मक भाग अनुसार क्रमबद्ध करें John_12, Chris_101 जैसे स्ट्रिंग कॉलम से संख्यात्मक भाग निकालकर क्रमबद्ध करें और विशिष्ट रिकॉर्ड प्राप्त करें। टेबल बनाएं और डेटा डालें: mysql> create table DemoTable2006 ( UserId int NOT NULL AUTO_INCREMENT PRIMARY KEY, UserCode varchar(20