Sqlserver
 sql >> डेटाबेस >  >> RDS >> Sqlserver

एकाधिक पंक्तियों में मानों को विभाजित करें

आप इसके समान कुछ प्रकार के टेबल-वैल्यू स्प्लिट फंक्शन का उपयोग करना चाहेंगे:

create FUNCTION [dbo].[Split](@String varchar(MAX), @Delimiter char(1))       
returns @temptable TABLE (items varchar(MAX))       
as       
begin      
    declare @idx int       
    declare @slice varchar(8000)       

    select @idx = 1       
        if len(@String)<1 or @String is null  return       

    while @idx!= 0       
    begin       
        set @idx = charindex(@Delimiter,@String)       
        if @idx!=0       
            set @slice = left(@String,@idx - 1)       
        else       
            set @slice = @String       

        if(len(@slice)>0)  
            insert into @temptable(Items) values(@slice)       

        set @String = right(@String,len(@String) - @idx)       
        if len(@String) = 0 break       
    end   
return 
end;

फिर आप outer apply . का उपयोग कर सकते हैं अपने टेबल से जुड़ने के लिए:

select t1.reference,
  t1.name,
  t1.subjectstitle,
  i.items subjects
from yourtable t1
outer apply dbo.split(t1.subjects, ',') i

इस तरह परिणाम देना:

| REFERENCE |                          NAME | SUBJECTSTITLE | SUBJECTS |
------------------------------------------------------------------------
|  LL9X81MT | Making and Decorating Pottery |        (null) |      F06 |
|  LL9X81MT | Making and Decorating Pottery |        (null) |      F27 |
|  LL9X81MT | Making and Decorating Pottery |        (null) |      F38 |

डेमो के साथ SQL फिडेल देखें

अगर आप इसे बिना स्प्लिट फंक्शन के करना चाहते हैं, तो आप सीटीई का उपयोग कर सकते हैं:

;with cte (reference, name, subjectstitle, subjectitem, subjects) as
(
  select reference,
    name,
    subjectstitle,
    cast(left(subjects, charindex(',',subjects+',')-1) as varchar(50)) subjectitem,
         stuff(subjects, 1, charindex(',',subjects+','), '') subjects
  from yourtable
  union all
  select reference,
    name,
    subjectstitle,
    cast(left(subjects, charindex(',',subjects+',')-1) as varchar(50)) ,
    stuff(subjects, 1, charindex(',',subjects+','), '') subjects
  from cte
  where subjects > ''
) 
select reference, name, subjectstitle, subjectitem
from cte

डेमो के साथ SQL Fiddle देखें



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL सर्वर में किसी पहचान कॉलम पर वर्तमान पहचान मान वापस करने के लिए IDENT_CURRENT() का उपयोग करें

  2. SQLSERVER में लिस्टएजीजी

  3. SQL सर्वर (T-SQL उदाहरण) में 'datetimeoffset' को 'तिथि' में बदलें

  4. CAST और IsNumeric

  5. मैं गिनती (*) कॉलम में उपनाम का उपयोग क्यों नहीं कर सकता और इसे एक खंड में संदर्भित कर सकता हूं?