Doe John James
、Doe Jane
、Doe Henry Albert Sr
などの名前のリストがあります。
それらを名前の4つの構成部分(名前に4つの部分がある場合)に分割して、それぞれを独自の列(姓、名、ミドルネーム、サフィックス)に配置する必要があります。またはミドルネームまたはサフィックスがない場合があります。
私は、サフィックスがある3番目のインスタンスを除いて、すべてを把握しました。
私のファーストネームは:
case
when LEN(LTRIM(rtrim(@name))) - LEN(replace(ltrim(rtrim(@name)),' ','')) = 2
then LEFT(SUBSTRING(LTRIM(RTRIM(@name)), CHARINDEX(' ', LTRIM(RTRIM(@name))) + 1, LEN(LTRIM(RTRIM(@name)))), CHARINDEX(' ', SUBSTRING(LTRIM(RTRIM(@name)), CHARINDEX(' ', LTRIM(RTRIM(@name))) + 2, LEN(LTRIM(RTRIM(@name))))))
else
SUBSTRING(@name, CHARINDEX(' ', @name) + 1, LEN(@name))
end as firstName
かなりクレイジーですが、うまくいきます...
ミドルネームの場合:
case
when LEN(LTRIM(rtrim(@name))) - LEN(replace(ltrim(rtrim(@name)),' ','')) = 2
then
REVERSE(SUBSTRING(REVERSE(LTRIM(RTRIM(@name))),1,CHARINDEX(' ',REVERSE(LTRIM(RTRIM(@name))))))
else ''
end as middleName
名ほど複雑ではありません。
姓が先頭にあるため、これが最も簡単です。
SUBSTRING(LTRIM(RTRIM(@name)),1,CHARINDEX(' ',LTRIM(RTRIM(@name)))-1) as lastName
しかし、サフィックス(Jr、Sr、IIIなど)が付いた名前を許可する方法がわかりません。
このようなことがあなたを助けますか:
With split(id, n, start, pos) as(
SELECT id, 1, 0, CHARINDEX(' ', fullname) FROM @names
UNION ALL
SELECT n.id, n+1, pos+1, CHARINDEX(' ', fullname, pos+1)
FROM @names n
INNER JOIN split s ON n.id = s.id
WHERE CHARINDEX(' ', fullname, start+1) > 0
)
SELECT id
, lastName = MAX(CASE WHEN v.n = 1 THEN v.val END)
, firstname = MAX(CASE WHEN v.n = 2 THEN v.val END)
, middleName = MAX(CASE WHEN v.n = 3 THEN v.val END)
, title = MAX(CASE WHEN v.n = 4 THEN v.val END)
FROM (
SELECT n.id, s.n
, SUBSTRING(n.fullname
, s.start
, CASE WHEN s.pos = 0 THEN LEN(n.fullname)+1 ELSE s.pos END -s.start
)
FROM @names n
INNER JOIN split s ON n.id = s.id
) as v(id, n, val)
GROUP BY id
--OPTION(MAXRECURSION 4)
;
n
を取得します。n
の値に基づいて、GROUP BYはそれらをそれぞれの列に配置します。大きなテーブルでは、効率が良くないかもしれません。
出力:
id lastName firstname middleName title
0 Doe John James NULL
1 Doe Jane NULL NULL
2 Doe Henry Albert Sr
3 Bart Simpson NULL NULL
データ:
declare @names table(id int identity(0, 1), fullname varchar(200), first varchar(50), middle varchar(50), last varchar(50), title varchar(50));
INSERT INTO @names(fullname) values
('Doe John James')
, ('Doe Jane')
, ('Doe Henry Albert Sr')
, ('Bart Simpson')
;