2017-05-20 12 views
1

に基づいています。こんにちはすべて私はSQLの初心者です。この列にはdilution_nameという名前の列があります。値はA、B、Cなどのコンマで区切られた形式です。これらの値は、A、B、C、場合によってはA、B、C、Dのような値がいくつかの行のように変化することがあります。値は、コンマで書かれることになる残りの部分は、私が試してみました nullにする必要があります3つの値があるはずですコンマで区切られた値はSQLの条件

select ParsedData.* 
    from dilution_table mt 
    cross apply (select str = mt.dilution_name + ',,') f1 
    cross apply (select p1 = charindex(',', str)) ap1 
    cross apply (select p2 = charindex(',', str, p1 + 1)) ap2 
    cross apply (select p3 = charindex(',', str, p2 + 2)) ap3 
    cross apply (select p4 = charindex(',', str, p3 + 3)) ap4 
    cross apply (select p5 = charindex(',', str, p4 + 4)) ap5 
    cross apply (select p6 = charindex(',', str, p5 + 5)) ap6 
    cross apply (select val1 = substring(str, 1, p1-1)     
      , val2 = substring(str, p1+1, p2-p1-1), 
       val3 = substring(str, p2+1, p2-p1-1), 
       val4 = substring(str, p3+1, p2-p1-1), 
       val5 = substring(str, p4+1, p2-p1-1), 
       val6 = substring(str, p5+1, p2-p1-1), 
       val7 = substring(str, p6+1, p2-p1-1) 
    ) ParsedData 


      [sample data][1] 

sample data

+0

、http://stackoverflow.com/questions/40609102/tsql-parse-string-with-4-delimiters/40609526#40609526 –

+0

@vkp覗いて見て下さい - 私はこれが二重引用符であることに同意するが、2つの簡単な点がある。 1)OP列が行ではない、2)少なくとも、複数ステートメントのループではなく、セットベースのスプリッタを指している。 –

答えて

0

SQL Server 2016+では、string_split()を使用できます(ただし、序数はありません)。

declare @str varchar(128) = 'a,b,c,d' 

select s.ItemNumber, s.Item 
from dbo.delimitedsplit8k(@str,',') s; 

rextesterデモ:http://rextester.com/EGZ24917

リターン:

+------------+------+ 
| ItemNumber | Item | 
+------------+------+ 
|   1 | a | 
|   2 | b | 
|   3 | c | 
|   4 | d | 
+------------+------+ 

にジェフMODENでCSVスプリッタテーブル値関数を使用してSQL Serverプリ2016年に

、分割後にデータをピボットすると、次のような条件付き集計を使用できます。

select 
    v1 = max(case when s.ItemNumber = 1 then s.Item end) 
    , v2 = max(case when s.ItemNumber = 2 then s.Item end) 
    , v3 = max(case when s.ItemNumber = 3 then s.Item end) 
    , v4 = max(case when s.ItemNumber = 4 then s.Item end) 
    , v5 = max(case when s.ItemNumber = 5 then s.Item end) 
from dbo.delimitedsplit8k(@str,',') s; 

戻り値:

+----+----+----+----+------+ 
| v1 | v2 | v3 | v4 | v5 | 
+----+----+----+----+------+ 
| a | b | c | d | NULL | 
+----+----+----+----+------+ 

分割文字列が参照:

+0

分割された値を必要とせず、行内に印刷したい5つのカンマ区切りの値があり、次に5つの列の水平が見え、4つのカンマ区切りの値がある場合は4つの値がそこにあり、5番目の列はNULLになるはずです –

+0

@shravanpal私の間違いは、スプリット後のピボットの条件付き集約形式を含むように更新されました。 – SqlZim

+0

私はあなたのコードを結んでいましたが、私は欲望の結果を得ていませんでした –

関連する問題