Skip to main content

How to convert comma seperated values into table-rows

Let's say we've set of data in array format e.g. "Ram, Shyam, Mohan, Sohan, Sohit"
and we want a result-set in tabular format



Name
Ram
Shyam
Mohan
Sohan
Sohit


Mysql database doesn't support array data-type, so we can't do the conversion easily in the expected format.
Here is the query to full-fill this requirement.

Step1. Execute the below query in your MySQL database schema




-- STORED PROCEDURES
DROP PROCEDURE IF EXISTS ;
split_words_into_rows
DELIMITER #

CREATE PROCEDURE split_words_into_rows(IN _in_tags_to_be_seperated VARCHAR(8000), IN _in_seperator CHAR(3))
proc_main:BEGIN -- 1. Begin Proc

-- watch out for variable names that have the same names as fields !!
DECLARE v_keyword VARCHAR(255);

DECLARE v_keyword_id MEDIUMINT UNSIGNED;

-- Iteration variable (v_tags_done: if done through each and every word of input string paramter,
--                                    v_tags_idx: currently running id )                                                     
DECLARE v_tags_done TINYINT UNSIGNED;
DECLARE v_tags_idx INT UNSIGNED;

-- Temporary Table Declaration & initialization (as DB doesn't support array, we've to split the incoming tag based and put each and
--                             every "tag" into temporary table, MAKE SURE TO DROP IT BEFORE LEAVING THE PROC)
-- drop temporary table
DROP TEMPORARY TABLE IF EXISTS temp_words_to_delete;

--  create temporary table
CREATE TEMPORARY TABLE temp_words_to_delete (Id INT NOT NULL PRIMARY KEY AUTO_INCREMENT, Word VARCHAR(256));

-- set autocommit false. we'll commit manually.
SET autocommit = 0;

  -- split the out the _in_tags_to_be_seperated and insert into temporary table
  SET v_tags_done = 0;      
  SET v_tags_idx = 1;

  WHILE NOT v_tags_done DO -- 1.BEGIN WHILE 
    -- get the word from "," to ","
    SET v_keyword = SUBSTRING(_in_tags_to_be_seperated, v_tags_idx,
      IF(LOCATE(_in_seperator, _in_tags_to_be_seperated, v_tags_idx) > 0,
        LOCATE(_in_seperator, _in_tags_to_be_seperated, v_tags_idx) - v_tags_idx,
        LENGTH(_in_tags_to_be_seperated))
        );

      IF LENGTH(v_keyword) > 0 THEN

        SET v_tags_idx = v_tags_idx + LENGTH(v_keyword) + 1;

        SET v_keyword = TRIM(v_keyword);

        -- add the keyword into temporary table
        INSERT IGNORE INTO temp_words_to_delete (Word) VALUES (v_keyword);

      ELSE
        SET v_tags_done = 1;
      END IF;

  END WHILE; -- 1.END WHILE 

COMMIT;

-- Select records
SELECT Id, Word FROM temp_words_to_delete;

-- Clean your DB: drop temporary table (it should be last statement
--                                      , if you want to use the data of temporary table in between the proc)
DROP TEMPORARY TABLE IF EXISTS temp_words_to_delete;

END proc_main # -- -- 1. End Proc


 Step2. Use following query to verify the result set.


CALL split_words_into_rows('Ram, Shyam, Mohan, Sohan, Sohit', ',');


You'll get output like this

 










Comments

Popular posts from this blog

EFCore - Collate function

Search in SQL server query is generally case insensitive (by default or based on database level collation). Suppose we have an employees table with a row having first-name column value as "My-First-Name", so if we want to do the case-sensitive search we have to explicitly use the related collate: In EF 5 (currently in Release Candidate version [RC.2.20475.6]) Collate function got introduced which helps us to use our specific collation based search.  C# with EF5 code sample: var employeeCaseSensitiveSearch = _dbContext.Employees .Where(x => EF.Functions.Collate(x.FirstName, "Latin1_General_CS_AS") == "my-first-name") .FirstOrDefault(); A related database query will be something like this: T-SQL: Case sensitive search (use specific collation e.g.: Latin1_General_CS_AS) SELECT * FROM dbo.Employees AS e WHERE e.FirstName Collate Latin1_General_CS_AS = 'my-first-name' Some of the useful CSharp function which g...

How to install Zen-coding plugin

As a web-developer, irrespective of the technologies (java, c-sharp, python, php e.t.c.…), we used to write CSS code to make our web-pages looks good if not at least we’re involved in write html codes. What if there is some tool to whom you give some instruction and that tool generates a good, well formatted html tags for you. These kind of coding is possible and known as “ Zen coding ” and there are lots of plug-in available from different vendors. We’re going to  discuss the steps to install this “zen-coding” plugin for “visual studio, eclipse, sublime-text & notepad++ in next few lines. Follow the below steps to install "zen-coding" plugin based on your editor.  Steps to install zen-coding plugin for (visual studio, eclipse, sublime-text,notepad++) -- -- For Visual Studio 1. Go to "Tools" -> "Extensions and Updates" 2. It'll open the "Extensions and Updates windows"    Select online form Left hand menu items ent...

EFCore - Scaffold-DbContext how to use

EFCore versions, we don't have GUI to manage the DB-entities & dbContext like we used to have with EF6 (or EF5/4 version). With EFCore we've the Scaffold-DbContext command which helps us to create entities & DB context from our DB-objects.  Let's see how to use Scaffold-DbContext: Assume we're connecting with SQL Server so after creating a sample project you'll have to install EFCore related libraries as mentioned below.  Install entity-framework-core for SQL Server, at this time 3.1.9 is the latest stable version   Microsoft.EntityFrameworkcore   Microsoft.EntityFrameworkCore.SqlServer  To use Scaffold-DbContext, following two NuGet packages are required Microsoft.EntityFrameworkCore.Tools  Microsoft.EntityFrameworkCore.Design Let's say we've two DB tables (e.g. dbo.Employees & dbo.Users )  Now let's see how to use Scaffold-DbContext to create c-...