sql-server - 将列字符串数据分成多列 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
解决方案
您可以在类似的行上使用以下代码。
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
推荐阅读
- python - 在 Python 中拆分列表并将其插入 Excel
- c++ - 使用示例构建 websocketpp 时出现链接错误
- python - Python:我可以在 python 中导入包,但不能在笔记本中导入
- swift - Scenekit - 未检测到碰撞
- angular - 如何在不刷新的情况下自动更新html页面上的详细信息
- java - 根据他们所做的操作系统日期、时间设置,使用 java 获取用户的日期和时间格式
- c++ - 包扩展内的整数增量
- selenium-webdriver - Jasmine - 在测试之间重新启动浏览器(它会阻塞)
- firebase - 如何使用 map 方法省略具有不存在键或空值的文档的迭代
- omnet++ - 静脉行人模拟 (omnet++/sumo)