将列字符串数据分成多个列SQL [复制]

问题描述 投票:-2回答:1

这个问题在这里已有答案:

如何将列字符串值分隔为多个列。假设我有一行名为“John Bob UnderWood JR”和另一个名字“Sally Woods Feld”任何人都可以帮我一个例子。我在使用名称长于两个值的子字符串和CHARINDEX时遇到问题。下面我有一个两个名称字段,但不知道如何继续使用两个以上的名称。

SELECT substring(Username, 1, CHARINDEX(' ',Username)-1) FirstName, 
substring(Username, CHARINDEX(' ',Username)+1, LEN(Username)) LastName 
FROM tblName

我也用过:

Select parsename(Replace(name_ind, ' ', '.'), 3) as LastName,
parsename(Replace(name_ind, ' ', '.'), 2) as FirstName,
parsename(Replace(name_ind, ' ', '.'), 1) as MiddleName,
parsename(Replace(name_ind, ' ', '.'), 4) as Suffix
from UspfoWeb.dbo.tbl_pers_svcmbr_tbl_go;

接近我希望看到的输出,但是当名称中有后缀时,它会进入姓氏点,如果只有两个名字而不是它们的姓氏进入中间名称列。我假设我需要创建一个if语句来对它们进行排序吗?

预期结果:

firstName    lastname   middleName   Suffix
John         Bob        Underwood    Jr.
Sally        Woods      Feld
sql-server tsql
1个回答
0
投票

您可以在类似的行上使用以下代码。

GO
CREATE FUNCTION dbo.SplitStrings
(
   @List       NVARCHAR(MAX),
   @Delimiter  NVARCHAR(255)
)
RETURNS @Tab TABLE(ID INT IDENTITY,Item NVARCHAR(10))  
AS
BEGIN
      INSERT INTO @Tab(Item)   
      SELECT Item = y.i.value('(./text())[1]', 'nvarchar(4000)')
      FROM 
      ( 
        SELECT x = CONVERT(XML, '<i>' 
          + REPLACE(@List, @Delimiter, '</i><i>') 
          + '</i>').query('.')
      ) AS a CROSS APPLY x.nodes('i') AS y(i)
   RETURN;
END
GO

SELECT *
,
(SELECT Item
FROM dbo.SplitStrings(UserName,' ')
WHERE ID = 1) AS [First Name]
,
(SELECT Item
FROM dbo.SplitStrings(UserName,' ')
WHERE ID = 2) AS [Last Name]
,
(SELECT Item
FROM dbo.SplitStrings(UserName,' ')
WHERE ID = 3) AS [Middle Name]
,   
(SELECT Item
FROM dbo.SplitStrings(UserName,' ')
WHERE ID = 4) AS [Suffix]
FROM UserTable
© www.soinside.com 2019 - 2024. All rights reserved.