Mysql में name string कैसे विभाजित करें?


103

Mysql में name string कैसे विभाजित करें?

उदाहरण के लिए:

name
-----
Sachin ramesh tendulkar
Rahul dravid

नाम को विभाजित करें firstname,middlename,lastname:

firstname   middlename    lastname
---------  ------------   ------------
sachin     ramesh         tendulkar
rahul      dravid

4
जब आपकी तालिकाओं को ठीक से सामान्य किया जाता है, तो आपको इस पर कोई समस्या नहीं होती है। आपको मूल्यों को विभाजित करने की आवश्यकता नहीं है।
जॉन वू


2
@JW। दुर्भाग्य से, विशेष रूप से नाम एक कठिन हैं। kalzumeus.com/2010/06/17/…
मैट बॉल

1
@ माधव अगर आपके सवालों का कोई जवाब हल हो गया तो क्लिक करें ... हिंट हिंट;)
जेसी सी।

जवाबों:


181

मैंने इस उत्तर को दो (2) विधियों में बदल दिया है। पहली विधि आपके फुलनाम फ़ील्ड को पहले, मध्य और अंतिम नामों से अलग करेगी। यदि कोई मध्य नाम नहीं है, तो मध्य नाम NULL के रूप में दिखाई देगा।

SELECT
   SUBSTRING_INDEX(SUBSTRING_INDEX(fullname, ' ', 1), ' ', -1) AS first_name,
   If(  length(fullname) - length(replace(fullname, ' ', ''))>1,  
       SUBSTRING_INDEX(SUBSTRING_INDEX(fullname, ' ', 2), ' ', -1) ,NULL) 
           as middle_name,
   SUBSTRING_INDEX(SUBSTRING_INDEX(fullname, ' ', 3), ' ', -1) AS last_name
FROM registeredusers

यह दूसरी विधि मध्य नाम को अंतिम नाम के हिस्से के रूप में मानती है। हम केवल आपके पूर्ण नाम फ़ील्ड से एक प्रथम नाम और अंतिम नाम कॉलम चुनेंगे।

SELECT
   SUBSTRING_INDEX(SUBSTRING_INDEX(fullname, ' ', 1), ' ', -1) AS first_name,
    TRIM( SUBSTR(fullname, LOCATE(' ', fullname)) ) AS last_name
FROM registeredusers

वहाँ ठंडी चीजों का एक गुच्छा होता है, जिसे आप रूट के साथ कर सकते हैं, पता लगा सकते हैं, substring_index, आदि कुछ वास्तविक भ्रम के लिए मैनुअल की जाँच कर सकते हैं। http://dev.mysql.com/doc/refman/5.0/en/string-functions.html


6
गोश ने कहा कि इंटेल ने मुझे mysql प्रो कौशल के साथ सुपर मानव महसूस किया है। मेरे पास पूरी तरह से PHP प्रसंस्करण को हटा दिया गया है और एक एकल क्वेरी में तर्क की 100 पंक्तियों को बदल दिया है। ये अद्भुत है!
TeaCupApp

1
बहुत अच्छे। क्या वास्तव में मुझे इसकी आवश्यकता थी और शायद उसने चाहने वालों की तुलना में बेहतर ढंग से पूछे जाने वाले समस्या की घटना को हल किया, क्योंकि दो शब्दों के मामले में केवल firstname और lastname सेट नहीं है firstname और middlename।
जैनीस ग्रूजिस

पहली विधि ने मुझे बहुत मदद की। केवल मैंने देखा कि एक अंतिम नाम "सेंट जॉर्ज" था जिसे मध्य नाम "सेंट" के रूप में उठाया गया था।
जो एम।

1
हेलो सर मुझे पता है यह एक पुराना धागा है। यदि व्यक्ति का एक्सटेंशन नाम है तो कैसे होगा?
ट्राफलगर डी लॉ

1
@ TrafalgarDLaw मैंने ऊपर एक समाधान पोस्ट किया है। - stackoverflow.com/a/44802256/3542883
जूनियर

22

खैर, मेरे द्वारा उपयोग किए गए कुछ भी नहीं, इसलिए मैंने एक वास्तविक सरल विभाजन फ़ंक्शन बनाने का फैसला किया, आशा है कि यह मदद करता है:

DECLARE inipos INTEGER;
DECLARE endpos INTEGER;
DECLARE maxlen INTEGER;
DECLARE item VARCHAR(100);
DECLARE delim VARCHAR(1);

SET delim = '|';
SET inipos = 1;
SET fullstr = CONCAT(fullstr, delim);
SET maxlen = LENGTH(fullstr);

REPEAT
    SET endpos = LOCATE(delim, fullstr, inipos);
    SET item =  SUBSTR(fullstr, inipos, endpos - inipos);

    IF item <> '' AND item IS NOT NULL THEN           
        USE_THE_ITEM_STRING;
    END IF;
    SET inipos = endpos + 1;
UNTIL inipos >= maxlen END REPEAT;

18

यहाँ विभाजित फंक्शन है जिसका मैं उपयोग करता हूँ:

--
-- split function
--    s   : string to split
--    del : delimiter
--    i   : index requested
--

DROP FUNCTION IF EXISTS SPLIT_STRING;

DELIMITER $

CREATE FUNCTION 
   SPLIT_STRING ( s VARCHAR(1024) , del CHAR(1) , i INT)
   RETURNS VARCHAR(1024)
   DETERMINISTIC -- always returns same results for same input parameters
    BEGIN

        DECLARE n INT ;

        -- get max number of items
        SET n = LENGTH(s) - LENGTH(REPLACE(s, del, '')) + 1;

        IF i > n THEN
            RETURN NULL ;
        ELSE
            RETURN SUBSTRING_INDEX(SUBSTRING_INDEX(s, del, i) , del , -1 ) ;        
        END IF;

    END
$

DELIMITER ;


SET @agg = "G1;G2;G3;G4;" ;

SELECT SPLIT_STRING(@agg,';',1) ;
SELECT SPLIT_STRING(@agg,';',2) ;
SELECT SPLIT_STRING(@agg,';',3) ;
SELECT SPLIT_STRING(@agg,';',4) ;
SELECT SPLIT_STRING(@agg,';',5) ;
SELECT SPLIT_STRING(@agg,';',6) ;

यह मेरे लिए ठीक काम किया, और एक अनंत लूप का कारण नहीं बना जैसे स्वीकृत उत्तर (स्पष्ट क्यों नहीं) - लेकिन यह विभाजक के रूप में व्हाट्सएप के साथ काम नहीं करता था। इस पर ठोकर खाने वाले किसी के लिए - इसके बजाय stackoverflow.com/questions/2696884/… को देखें।
अधिकतम

15

MySQL में कोई स्ट्रिंग स्प्लिट फंक्शन नहीं है। इसलिए आपको अपना खुद का फंक्शन बनाना होगा। इससे आपको मदद मिलेगी। इस लिंक पर अधिक जानकारी

समारोह:

CREATE FUNCTION SPLIT_STR(
  x VARCHAR(255),
  delim VARCHAR(12),
  pos INT
)
RETURNS VARCHAR(255)
RETURN REPLACE(SUBSTRING(SUBSTRING_INDEX(x, delim, pos),
       LENGTH(SUBSTRING_INDEX(x, delim, pos -1)) + 1),
       delim, '');

उपयोग:

SELECT SPLIT_STR(string, delimiter, position)

उदाहरण:

SELECT SPLIT_STR('a|bb|ccc|dd', '|', 3) as third;

+-------+
| third |
+-------+
| ccc   |
+-------+

यह अब तक का सबसे अच्छा जवाब है
हाइड्रोकैट

सबसे अच्छा जवाब, मैं निश्चित रूप से इसका इस्तेमाल करता हूं R
नूर हिदायत विजया

11

आप एक भी उपयोग कर सकते हैं:

SELECT SUBSTRING_INDEX(Name, ' ', 1) AS fname,
SUBSTRING_INDEX(SUBSTRING_INDEX(Name,' ', 2), ' ',-1) AS mname,
SUBSTRING_INDEX(Name, ' ', -1) as lname FROM mytable;

इसने मेरे लिए काम किया। मुझे इसका बुरा अभ्यास लगता है, लेकिन मैंने अपने केस स्टेटमेंट को डुप्लिकेट करने के लिए एक ही क्वेरी चलाई और देखा कि यह दृष्टिकोण दोगुना तेज़ है। धन्यवाद।
jDub9


2

अंतरिक्ष परिसीमन के दूसरे उदाहरण के बाद बाकी स्ट्रिंग प्राप्त करने के लिए

SELECT
   SUBSTRING_INDEX(SUBSTRING_INDEX('Sachin ramesh tendulkar', ' ', 1), ' ', -1) AS first_name, 
       SUBSTRING_INDEX(SUBSTRING_INDEX('Sachin ramesh tendulkar', ' ', 2), ' ', -1) 
           AS middle_name,
   SUBSTRING('Sachin ramesh tendulkar',LENGTH(SUBSTRING_INDEX('Sachin ramesh tendulkar', ' ', 2))+1) AS last_name

2
SELECT
    p.fullname AS 'Fullname',
    SUBSTRING_INDEX(p.fullname, ' ', 1) AS 'Firstname',
    SUBSTRING(p.fullname, LOCATE(' ',p.fullname), 
        (LENGTH(p.fullname) - (LENGTH(SUBSTRING_INDEX(p.fullname, ' ', 1)) + LENGTH(SUBSTRING_INDEX(p.fullname, ' ', -1))))
    ) AS 'Middlename',
    SUBSTRING_INDEX(p.fullname, ' ', -1) AS 'Lastname',
    (LENGTH(p.fullname) - LENGTH(REPLACE(p.fullname, ' ', '')) + 1) AS 'Name Qt'
FROM people AS p
LIMIT 100; 

व्याख्या:

Firstname और lastname खोजें आसान हैं, आपके पास सिर्फ SUBSTR_INDEX फ़ंक्शन का उपयोग करना है। मैजिकलेन में मैजिक होता है, जहां पहले स्पेस की स्थिति और पूर्ण नाम के LENGTH को खोजने के लिए SUBSTR का उपयोग किया गया था - (LENGTH #name + LENGTH lastname) सभी मिडिलनेम प्राप्त करने के लिए।

ध्यान दें कि Firstname और lastname के LENGTH की गणना SUBSTR_INDEX का उपयोग करके की गई थी


2
concat(upper(substring(substring_index(NAME, ' ', 1) FROM 1 FOR 1)), lower(substring(substring_index(NAME, ' ', 1) FROM 2 FOR length(substring_index(NAME, ' ', 1))))) AS fname,
CASE 
WHEN length(substring_index(substring_index(NAME, ' ', 2), ' ', -1)) > 2 THEN 
  concat(upper(substring(substring_index(substring_index(NAME, ' ', 2), ' ', -1) FROM 1 FOR 1)), lower(substring(substring_index(substring_index(f.nome, ' ', 2), ' ', -1) FROM 2 FOR length(substring_index(substring_index(f.nome, ' ', 2), ' ', -1)))))
  ELSE 
  CASE 
  WHEN length(substring_index(substring_index(f.nome, ' ', 3), ' ', -1)) > 2 THEN 
    concat(upper(substring(substring_index(substring_index(f.nome, ' ', 3), ' ', -1) FROM 1 FOR 1)), lower(substring(substring_index(substring_index(f.nome, ' ', 3), ' ', -1) FROM 2 FOR length(substring_index(substring_index(f.nome, ' ', 3), ' ', -1)))))
  END 
END 
AS mname

1
CREATE DEFINER=`root`@`localhost` FUNCTION `getNameInitials`(`fullname` VARCHAR(500), `separator` VARCHAR(1)) RETURNS varchar(70) CHARSET latin1
    DETERMINISTIC
BEGIN
DECLARE `result` VARCHAR(500) DEFAULT '';
DECLARE `position` TINYINT;



SET `fullname` = TRIM(`fullname`);

SET `position` = LOCATE(`separator`, `fullname`);

IF NOT `position`
THEN RETURN LEFT(`fullname`,1);
END IF;

SET `fullname` = CONCAT(`fullname`,`separator`);
SET `result` = LEFT(`fullname`, 1);

cycle: LOOP
    SET `fullname` = SUBSTR(`fullname`, `position` + 1);
    SET `position` = LOCATE(`separator`, `fullname`);

    IF NOT `position` OR NOT LENGTH(`fullname`)
    THEN LEAVE cycle;
    END IF;

    SET `result` = CONCAT(`result`,LEFT(`fullname`, 1));
   -- SET `result` = CONCAT_WS(`separator`, `result`, `buffer`);
END LOOP cycle;

RETURN upper(`result`);
END

1. इस फ़ंक्शन को mysql में निष्पादित करें। 2. यह एक फंक्शन बनाएगा। अब आप इस फ़ंक्शन का उपयोग कहीं भी कर सकते हैं।

 SELECT `getNameInitials`('Kaleem Ul Hassan', ' ') AS `NameInitials`;

3. उपरोक्त getNameInitails पहला पैरामीटर स्ट्रिंग है जिसे आप फ़िल्टर करना चाहते हैं और दूसरा वह दर्शक वर्ण है जिस पर आप स्ट्रिंग को अलग करना चाहते हैं। 4. ऊपर के उदाहरण में 'कलीम उल हसन' नाम है और मैं आद्याक्षर प्राप्त करना चाहता हूं और मेरा विभाजक अंतरिक्ष '' है।


1

हमने एकल स्तंभ ChapterName में पाठ्यक्रम नाम और अध्याय नाम का मान संग्रहीत किया है।

मूल्य इस तरह संग्रहीत: "जावा: बहुरूपता"

आपको कोर्सनेम को पुनः प्राप्त करने की आवश्यकता है: जावा और अध्यायनाम: बहुरूपता

नीचे SQL चयन क्वेरी को पुनः प्राप्त करने के लिए है।

       SELECT   
          SUBSTRING_INDEX(SUBSTRING_INDEX(ChapterName, ' ', 1), ' ', -1) AS 
       CourseName,

       REPLACE(TRIM(SUBSTR(ChapterName, LOCATE(':', ChapterName)) ),':','') AS 
       ChapterName
       FROM Courses where `id`=1;

अगर इस पर कोई सवाल है तो कृपया मुझे बताएं।


0

अंतरिक्ष के दूसरे उदाहरण के बाद स्ट्रिंग के बाकी हिस्सों को प्राप्त करने के लिए:

SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(MsgRest, ' ', 1), ' ', -1) AS EMailID
,  SUBSTRING_INDEX(SUBSTRING_INDEX(MsgRest, ' ', 2), ' ', -1) AS DOB
,  IF(
    LOCATE(' ', `MsgRest`) > 0,
    TRIM(SUBSTRING(SUBSTRING(`MsgRest`, LOCATE(' ', `MsgRest`) +1), 
         LOCATE(' ', SUBSTRING(`MsgRest`, LOCATE(' ', `MsgRest`) +1)) +1)),
    NULL
) AS Person
FROM inbox

0

आप common_schema का उपयोग कर सकते हैं और फ़ंक्शन का उपयोग कर सकते tokenizeहैं। इसके बारे में अधिक जानकारी के लिए लिंक का अनुसरण करें। आपका कोड जैसे समाप्त होगा:

call tokenize(name, ' ');

हालांकि, इस बात से अवगत रहें कि पहले और अंतिम नाम के लिए एक स्पेस विश्वसनीय विभाजक नहीं है। उदाहरण के लिए, स्पेन में दो अंतिम नाम होना आम है।


0

DELIMITER $$

DROP FUNCTION IF EXISTS `split_name`$$

CREATE FUNCTION split_name (p_fullname TEXT, p_part INTEGER)
RETURNS TEXT
    READS SQL DATA
BEGIN
    DECLARE v_words INT UNSIGNED;
    DECLARE v_name TEXT;

    SET p_fullname=RTRIM(LTRIM(p_fullname));

    SET v_words=(SELECT SUM(LENGTH(p_fullname) - LENGTH(REPLACE(p_fullname, ' ', ''))+1));

    IF v_words=1 THEN 
        IF p_part=1 THEN
            SET v_name=p_fullname;
        ELSEIF p_part=2 THEN
            SET v_name=NULL;
        ELSEIF p_part=3 THEN
            SET v_name=NULL;
        ELSE
            SET v_name=NULL;
        END IF; 
    ELSEIF v_words=2 THEN 
        IF p_part=1 THEN
            SET v_name=SUBSTRING(p_fullname, 1, LOCATE(' ', p_fullname) - 1);
        ELSEIF p_part=2 THEN
            SET v_name=SUBSTRING(p_fullname, LOCATE(' ', p_fullname) + 1);
        ELSEIF p_part=3 THEN
            SET v_name=NULL;
        ELSE
            SET v_name=NULL;
        END IF; 
    ELSEIF v_words=3 THEN 
        IF p_part=1 THEN
            SET v_name=SUBSTRING(p_fullname, 1, LOCATE(' ', p_fullname) - 1);
        ELSEIF p_part=2 THEN
            SET p_fullname=SUBSTRING(p_fullname, LOCATE(' ', p_fullname) + 1);
            SET v_name=SUBSTRING(p_fullname, 1, LOCATE(' ', p_fullname) - 1);
        ELSEIF p_part=3 THEN
            SET p_fullname=REVERSE (SUBSTRING(p_fullname, LOCATE(' ', p_fullname) + 1));
            SET p_fullname=SUBSTRING(p_fullname, 1, LOCATE(' ', p_fullname) - 1);
            SET v_name=REVERSE(p_fullname);
        ELSE
            SET v_name=NULL;
        END IF; 
    ELSEIF v_words>3 THEN 
        IF p_part=1 THEN
            SET v_name=SUBSTRING(p_fullname, 1, LOCATE(' ', p_fullname) - 1);
        ELSEIF p_part=2 THEN
            SET p_fullname=REVERSE(SUBSTRING(p_fullname, LOCATE(' ', p_fullname) + 1));
            SET p_fullname=SUBSTRING(p_fullname, LOCATE(' ', p_fullname,SUBSTRING_INDEX(p_fullname,' ',1)+1) + 1);
            SET v_name=REVERSE(p_fullname);
        ELSEIF p_part=3 THEN
            SET p_fullname=REVERSE (SUBSTRING(p_fullname, LOCATE(' ', p_fullname) + 1));
            SET p_fullname=SUBSTRING(p_fullname, 1, LOCATE(' ', p_fullname) - 1);
            SET v_name=REVERSE(p_fullname);
        ELSE
            SET v_name=NULL;
        END IF;
    ELSE
        SET v_name=NULL;
    END IF;
 RETURN v_name; 
END;

SELECT split_name('Md. Obaidul Haque Sarker',1) AS first_name,
split_name('Md. Obaidul Haque Sarker',2) AS middle_name,
split_name('Md. Obaidul Haque Sarker',3) AS last_name

0

पहले नीचे के रूप में प्रक्रिया बनाएँ:

CREATE DEFINER=`root`@`%` PROCEDURE `sp_split`(str nvarchar(6500), dilimiter varchar(15), tmp_name varchar(50))
BEGIN

    declare end_index   int;
    declare part        nvarchar(6500);
    declare remain_len  int;

    set end_index      = INSTR(str, dilimiter);

    while(end_index   != 0) do

        /* Split a part */
        set part       = SUBSTRING(str, 1, end_index - 1);

        /* insert record to temp table */
        call `sp_split_insert`(tmp_name, part);

        set remain_len = length(str) - end_index;
        set str = substring(str, end_index + 1, remain_len);

        set end_index  = INSTR(str, dilimiter);

    end while;

    if(length(str) > 0) then

        /* insert record to temp table */
        call `sp_split_insert`(tmp_name, str);

    end if;

END

उसके बाद नीचे दी गई प्रक्रिया बनाएं:

CREATE DEFINER=`root`@`%` PROCEDURE `sp_split_insert`(tb_name varchar(255), tb_value nvarchar(6500))
BEGIN
    SET @sql = CONCAT('Insert Into ', tb_name,'(item) Values(?)'); 
    PREPARE s1 from @sql;
    SET @paramA = tb_value;
    EXECUTE s1 USING @paramA;
END

कैसे करें टेस्ट

CREATE DEFINER=`root`@`%` PROCEDURE `test_split`(test_text nvarchar(255))
BEGIN

    create temporary table if not exists tb_search
        (
            item nvarchar(6500)
        );

    call sp_split(test_split, ',', 'tb_search');

    select * from tb_search where length(trim(item)) > 0;

    drop table tb_search;

END


call `test_split`('Apple,Banana,Mengo');

0

SP बनाने के लिए यहाँ कुछ उत्तरों को संयोजित किया गया है जो स्ट्रिंग के भागों को लौटाता है।

drop procedure if exists SplitStr;
DELIMITER ;;
CREATE PROCEDURE `SplitStr`(IN Str VARCHAR(2000), IN Delim VARCHAR(1))  
    BEGIN
        DECLARE inipos INT;
        DECLARE endpos INT;
        DECLARE maxlen INT;
        DECLARE fullstr VARCHAR(2000);
        DECLARE item VARCHAR(2000);
        create temporary table if not exists tb_split
        (
            item varchar(2000)
        );



        SET inipos = 1;
        SET fullstr = CONCAT(Str, delim);
        SET maxlen = LENGTH(fullstr);

        REPEAT
            SET endpos = LOCATE(delim, fullstr, inipos);
            SET item =  SUBSTR(fullstr, inipos, endpos - inipos);

            IF item <> '' AND item IS NOT NULL THEN           
                insert into tb_split values(item);
            END IF;
            SET inipos = endpos + 1;
        UNTIL inipos >= maxlen END REPEAT;

        SELECT * from tb_split;
        drop table tb_split;
    END;;
DELIMITER ;
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.