首页 > 解决方案 > 将列字符串数据分成多列 SQL

问题描述

如何将列字符串值分成多列。假设我有一排名字是“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-servertsql

解决方案


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

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

推荐阅读