নামের স্ট্রিংটি কীভাবে mysql এ বিভক্ত করবেন?


107

নামের স্ট্রিংটি কীভাবে মাইএসকিএলে বিভক্ত করবেন?

যেমন:

name
-----
Sachin ramesh tendulkar
Rahul dravid

নামটি ভাগ করুন firstname,middlename,lastname:

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

4
যখন আপনার টেবিলগুলি যথাযথভাবে স্বাভাবিক করা হয় তখন আপনার কোনও সমস্যা হয় না। আপনার মানগুলি ভাগ করার দরকার নেই।
জন উু


4
@ জেডাব্লু দুর্ভাগ্যক্রমে, বিশেষত নামগুলি একটি শক্ত নাম। kalzumeus.com/2010/06/17/…
ম্যাট বল

4
@ মাধব যদি উত্তরগুলির কোনও উত্তর থেকে আপনার প্রশ্নের সমাধান হয় তবে ক্লিক করুন সমাধান হয়েছে ... ইঙ্গিত;)
জেসি সি

উত্তর:


187

আমি এই উত্তরটি দুটি (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

সাবস্ট্রট, সনাক্তকরণ, সাবস্ট্রিং_ইন্ডেক্স ইত্যাদি দিয়ে করতে পারেন এমন দুর্দান্ত কিছু জিনিস রয়েছে যা কিছু বাস্তব বিভ্রান্তির জন্য ম্যানুয়ালটি পরীক্ষা করে দেখুন। http://dev.mysql.com/doc/refman/5.0/en/string-funifications.html


6
গোশ যে ইন্টেল সবেমাত্র মাইএসকিএল প্রো দক্ষতার সাথে আমাকে সুপার হিউম্যান বোধ করেছে। আমি পুরোপুরি পিএইচপি প্রসেসিং মুছে ফেলেছি এবং একটি একক ক্যোয়ারিতে লজিকের 100 লাইন ঘুরিয়েছি। এটা চমৎকার!
টিউকপ অ্যাপ্লিকেশন

4
সত্যিই সুন্দর. আমার যা প্রয়োজন ছিল ঠিক তেমনটিই করেছেন এবং সম্ভবত জিজ্ঞাসকদের সমস্যা ইভেন্টটি তাঁর ইচ্ছার চেয়ে ভাল সমাধান করেছেন, যেহেতু দুটি শব্দের ক্ষেত্রে কেবলমাত্র প্রথম নাম এবং পদবি রাখা হয়েছে প্রথম নাম এবং মিডলনাম নয়।
জোনিস গ্রুজিস

প্রথম পদ্ধতিটি আমাকে অনেক সাহায্য করেছিল। আমি যে ইস্যুটি দেখেছি কেবল এটিই একটি শেষ নাম "সেন্ট জর্জ" ছিল মধ্য নাম "সেন্ট" হিসাবে নেওয়া।
জো এম

4
হ্যালো স্যার আমি জানি এটি একটি পুরানো সুতো। কীভাবে যদি ব্যক্তির একটি এক্সটেনশনের নাম থাকে?
ট্রাফালগার ডি আইন

4
@ ট্রাফলগারডল আমি উপরে একটি সমাধান পোস্ট করেছি। - স্ট্যাকওভারফ্লো.com
জুনিয়র

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;

21

মাইএসকিউএলে কোনও স্ট্রিং বিভক্ত ফাংশন নেই। সুতরাং আপনাকে নিজের ফাংশন তৈরি করতে হবে। এটি আপনাকে সাহায্য করবে। এই লিঙ্কে আরও বিশদ

ফাংশন:

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   |
+-------+

এটি এখন পর্যন্ত সেরা উত্তর
হাইড্রোক্যাট

সেরা উত্তর, আমি অবশ্যই এটি ব্যবহার করি 👍✨
নূর হিদায়াত

কিংবদন্তি !!!!!!!!
হাইপ এনগুইন

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/… দেখুন ।
সর্বোচ্চ

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;

এটি আমার পক্ষে কাজ করেছে। আমি এর খারাপ অনুশীলনের মতো অনুভব করছি, তবে আমি আমার কেস স্টেটমেন্টের সদৃশ করে একই ক্যোয়ারী চালিয়েছি এবং দেখেছি যে এই পদ্ধতির দ্বিগুণ দ্রুত is ধন্যবাদ
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; 

ব্যাখ্যা:

প্রথম নাম এবং পদবি অনুসন্ধান সহজ, আপনি কেবলমাত্র SUBSTR_INDEX ফাংশনটি মিডলনেমে ব্যবহার করতে পারেন, যেখানে প্রথম স্থানের অবস্থান এবং পূর্ণরূপের LENGTH - (LENGTH ফার্স্টনাম + LENGTH পদবী) সমস্ত মিডলনেম পাওয়ার জন্য লবটের সাথে SUBSTR ব্যবহার করা হয়েছিল।

মনে রাখবেন যে প্রথম নাম এবং শেষ নামটির 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

মাইএসকিএলে এই ফাংশনটি বন্ধ করুন। 2. এটি একটি ফাংশন তৈরি করবে। এখন আপনি যে কোনও জায়গায় এই ফাংশনটি ব্যবহার করতে পারেন।

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

৩. উপরের getNameInitails প্রথম প্যারামিটারটি আপনি ফিল্টার করতে চান এমন স্ট্রিং এবং দ্বিতীয়টি হল দর্শকের চরিত্র যার উপর আপনি স্ট্রিংকে আলাদা করতে চান। ৪. উপরের উদাহরণে 'কালীম উল হাসান' নাম এবং আমি আদ্যক্ষর পেতে চাই এবং আমার বিভাজকটি স্থান '।


1

আমরা একক কলাম অধ্যায়নামে অবশ্যই নাম এবং অধ্যায়ের নামের মান সংরক্ষণ করেছি।

মান সংরক্ষণ করা হয় যেমন: "জাভা: বহুবিজ্ঞান"

আপনার কোর্সনাম পুনরুদ্ধার করতে হবে: জাভা এবং অধ্যায়ের নাম: পলিমারফিজম

নীচে পুনরুদ্ধার করতে এসকিউএল নির্বাচন জিজ্ঞাসা করা আছে।

       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

আপনি সাধারণ_সেমিমা ব্যবহার করতে পারেন এবং 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

এসপি তৈরি করতে এখানে কয়েকটি উত্তর সংযুক্ত করে স্ট্রিংয়ের অংশগুলি ফেরত দেয়।

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 ;
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.