データベースに次のような行のセットがあります。
Mr Joe Bloggs
Joe Bloggs
Joe Jim Bloggs
Joe Jim David Bloggs
Mr Joe Jim Bloggs
Mr Joe Jim David Bloggs
必要な出力:
Title | First Name | Middle Name | Surname
------------------------------------------
Mr | Joe | x | Bloggs
x | Joe | x | Bloggs
x | Joe | Jim | Bloggs
x | Joe | Jim David | Bloggs
Mr | Joe | Jim | Bloggs
Mr | Joe | Jim David | Bloggs
これはSQLストアドプロシージャで実行されます。必要なのは、CURSORと4つの変数をループしてデータベースの4つの列を更新するときに生成されるこの出力です。ただし、ご覧のとおり、データは1列にあり、さまざまです。
私はこれを行うための最良の方法を理解するのが難しいと感じています、そしてあなたの助けをお願いします。他に何か必要な場合はお知らせください。
私と同様の質問ですが、これらは私が必要とする完全な答えを私に与えていないように感じます、または私はそれが私の質問に答えないと思います:
- 列文字列を複数の列文字列に分割します
- 選択した結果(1列)を複数の列に分割します
- 複数の列に分割されたSQLの単一列
- SQLで列の値を異なる列に分割するにはどうすればよいですか?
- 1つの列を2つの列に分割するSQLクエリ
- SQLでテーブルの列が2つの列に分割されていますか?
編集:
--Temporary Table to Merge the full name together in order to split by comma. Each split will have a unique record but with the same address information for each name.
CREATE TABLE #TempOutput
(
ClientReference varchar(MAX),
Prefix varchar(MAX),
Reference int,
MergedFullName varchar(MAX),
FormatName varchar(MAX),
Title varchar(MAX),
FirstName varchar(MAX),
MiddleName varchar(MAX),
Surname varchar(MAX)
)
DECLARE @Ref varchar(MAX)
DECLARE @Prefix varchar(MAX)
DECLARE @Reference int
DECLARE @MergedName varchar(MAX)
DECLARE @FormatName varchar(MAX)
DECLARE @Title varchar(MAX)
DECLARE @FirstName varchar(MAX)
DECLARE @MiddleName varchar(MAX)
DECLARE @Surname varchar(MAX)
DECLARE ExtraNameSplitCursor CURSOR FOR
SELECT
[Client Reference],
Prefix,
Reference,
CASE
WHEN LEFT(Surname,3) = 'Mr,' THEN (Title + ' ' + [First Name] + ' ' + [Middle Name] + ' ' + Replace(Surname,'Mr,',''))
WHEN LEFT(Surname,4) = 'Mrs,' THEN (Title + ' ' + [First Name] + ' ' + [Middle Name] + ' ' + Replace(Surname,'Mrs,',''))
ELSE (Title + ' ' + [First Name] + ' ' + [Middle Name] + ' ' + Surname)
END AS [Merged Full Name]
FROM #StartResults
OPEN ExtraNameSplitCursor
FETCH NEXT FROM ExtraNameSplitCursor INTO @Ref, @Prefix, @Reference, @MergedName
WHILE @@FETCH_STATUS = 0
BEGIN
INSERT INTO #TempOutput (ClientReference, Prefix, Reference, MergedFullName)
SELECT @Ref, @Prefix, @Reference, GUID, FROM dbo.fn_SPLIT_LIST_STRING (@MergedName)
--SELECT CASE
-- WHEN @FormatName.GUID = 'Mr ' THEN @Title = 'Mr'
-- WHEN LEFT(@MergedName,4) = 'Mrs ' THEN @Title = 'Mrs'
-- WHEN LEFT(@MergedName,5) = 'Miss ' THEN @Title = 'Miss'
-- WHEN LEFT(@MergedName,3) = 'Ms ' THEN @Title = 'Ms'
-- WHEN LEFT(@MergedName,3) = 'Dr ' THEN @Title = 'Dr'
-- WHEN LEFT(@MergedName,4) = 'Rev ' THEN @Title = 'Rev'
-- WHEN LEFT(@MergedName,5) = 'Lord ' THEN @Title = 'Lord'
-- ELSE @Title = ''
--END AS Title,
--CASE
-- WHEN MID(@MergedName,2,1) = ' ' THEN @FirstName = '' ELSE @FirstName = CHARINDEX(' ', MergedFullName + ' ') FROM #TempOutput AS FirstName
FETCH NEXT FROM ExtraNameSplitCursor INTO @Ref, @Prefix, @Reference, @MergedName, @FlatNo, @HouseName, @HouseNo, @Street, @District, @PostTown, @County, @PostCode
END
CLOSE ExtraNameSplitCursor
DEALLOCATE ExtraNameSplitCursor
--Select statement for temporary table
SELECT
ISNULL(ClientReference,'') AS ClientReference,
ISNULL(Prefix,'') AS Prefix,
ISNULL(Reference,'') AS Reference,
ISNULL(MergedFullName,'') AS MergedFullName,
ISNULL(Title,'') AS Title,
ISNULL(FirstName,'') AS FirstName,
ISNULL(MiddleName,'') AS MiddleName,
ISNULL(Surname,'') AS Surname
FROM #TempOutput Result
ORDER BY ClientReference
for xml auto
--Drop all temporary tables
DROP TABLE #TempOutput
DROP TABLE #StartResults
END