3

次のようなデータベーステーブルに文字列があります。

Peter/Parker/Spiderman/Marvel
Bruce/Wayne/Batman/DC

SQL で文字列から特定の値を抽出する方法はありますか。

Name = MyColumn(0)
SurName = MyColumn(1)
Character = MyColumn(3)
Company = MyColumn(4)

ありがとう

4

2 に答える 2

13

ここでは、常に正確に 4 つの部分があると想定しています。

その場合は、組み込みの優れたParseName関数に置き換え/.使用できます。あなたの例の唯一の問題は、それが最後からカウントされることです。そのため、必要な部分に注意する必要があります。

DECLARE @test VARCHAR(max);
SET @test = 'Peter/Parker/Spiderman/Marvel';
SET @test = Replace(@test, '/', '.');

SELECT Parsename(@test, 4),--returns Peter
       Parsename(@test, 3),--returns Parker
       Parsename(@test, 2),--returns Spiderman
       Parsename(@test, 1) --returns Marvel

可変数のパーツがある場合は、これを行うための文字列分割関数を見つける必要があります。組み込みの適切な関数はありません。多くのオプションは、SO を検索して見つけることができます: https://stackoverflow.com /search?q=[SQL+サーバー]+文字列+分割

警告 - PARSENAME1 ~ 4 以外の数値を使用しようとすると、結果は常に NULL になります。

于 2012-11-30T12:39:35.863 に答える
5

正確に 4 つの列があることがわかっている場合は、次のネストされた CTE バージョンを使用することもできます。

;with s1 (name, extra) as
(
  select left(data, charindex('/', data)-1), 
    substring(data, charindex('/', data) +1, len(data))
  from yourtable
),
s2 (name, surname, extra) as
(
  select name, 
    left(extra, charindex('/', extra)-1), 
    substring(extra, charindex('/', extra)+1, len(extra))
  from s1
),
s3 (name, surname, [character], company) as
(
  select name, 
    surname, 
    left(extra, charindex('/', extra)-1), 
    substring(extra, charindex('/', extra)+1, len(extra))
  from s2
)
select *
from s3;

デモで SQL Fiddle を参照してください

結果は次のとおりです。

|  NAME | SURNAME | CHARACTER | COMPANY |
-----------------------------------------
| Peter |  Parker | Spiderman |  Marvel |
| Bruce |   Wayne |    Batman |      DC |

または、データを分割する CTE と次の両方を実装できますPIVOT

;with cte (item, data, colNum, rn) as
(
  select cast(left(data, charindex('/',data+'/')-1) as varchar(50)) item,
    stuff(data, 1, charindex('/',data+'/'), '') data,
    1 colNum,
    row_number() over(order by data) rn
  from yourtable
  union all
  select cast(left(data, charindex('/',data+'/')-1) as varchar(50)) ,
    stuff(data, 1, charindex('/',data+'/'), '') data,
    colNum+1, 
    rn
  from cte
  where data > ''
) 
select [1] as Name, 
  [2] as Surname, 
  [3] as [character], 
  [4] as company
from
(
  select item, colnum, rn
  from cte
) src
pivot
(
  max(item)
  for colnum in ([1], [2], [3], [4])
) piv

デモで SQL Fiddle を参照してください

于 2012-11-30T13:03:54.903 に答える