好的,我有一个名为PEOPLE的表,它有一个名称列。在名称列中是一个名称,但它完全是一团糟。由于某种原因,它没有列出如上,第一中间。它坐在最后,第一,中间和最后一个(和中间,如果有)用逗号隔开。如果这个人有中间名,则两个逗号。
示例:
smith,steve
smith,steve,j
smith,ryan,tom
我希望第二个逗号被删除(解析原因)空格放在现有的第一个逗号之后,所以上面的内容看起来像:
smith, steve
smith, steve j
smith, ryan tom
最终,我希望能够将名称解析为名字,中间名和姓名字段,但这是另一个帖子:_0。我感谢任何帮助。
谢谢。答案 0 :(得分:1)
这似乎有效。不是最简洁但是避免使用游标。
DECLARE @people TABLE (name varchar(50))
INSERT INTO @people
SELECT 'smith,steve'
UNION
SELECT 'smith,steve,j'
UNION
SELECT 'smith,ryan,tom'
UNION
SELECT 'commaless'
SELECT name,
CASE
WHEN CHARINDEX(',',name) > 0 THEN
CASE
WHEN CHARINDEX(',',name,CHARINDEX(',',name) + 1) > 0 THEN
STUFF(STUFF(name, CHARINDEX(',',name,CHARINDEX(',',name) + 1), 1, ' '),CHARINDEX(',',name),1,', ')
ELSE
STUFF(name,CHARINDEX(',',name),1,', ')
END
ELSE name
END AS name2
FROM @people
答案 1 :(得分:1)
使用表函数将名称与分隔符分开,并使用XML Path将它们拼接在一起,我们可以获得您正在寻找的内容!希望这有帮助!
Declare @People table(FullName varchar(200))
Insert Into @People Values ('smith,steve')
Insert Into @People Values ('smith,steve,j')
Insert Into @People Values ('smith,ryan,tom')
Insert Into @People Values ('smith,john,joseph Jr')
Select p.*,stuff(fn.FullName,1,2,'') as ModifiedFullName
From @People p
Cross Apply (
select
Case When np.posID<=2 Then ', ' Else ' ' End+np.Val
From @People n
Cross Apply Custom.SplitValues(n.FullName,',') np
Where n.FullName=p.FullName
For XML Path('')
) fn(FullName)
输出:
ModifiedFullName
smith, steve
smith, steve j
smith, ryan tom
smith, john joseph Jr
SplitValues表函数定义:
/*
This Function takes a delimited list of values and returns a table containing
each individual value and its position.
*/
CREATE FUNCTION [Custom].[SplitValues]
(
@List varchar(max)
, @Delimiter varchar(1)
)
RETURNS
@ValuesTable table
(
posID int
,val varchar(1000)
)
AS
BEGIN
WITH Cte AS
(
SELECT CAST('<v>' + REPLACE(@List, @Delimiter, '</v><v>') + '</v>' AS XML) AS val
)
INSERT @ValuesTable (posID,val)
SELECT row_number() over(Order By x) as posID, RTRIM(LTRIM(Split.x.value('.', 'VARCHAR(1000)'))) AS val
FROM Cte
CROSS APPLY val.nodes('/v') Split(x)
RETURN
END
GO
答案 2 :(得分:1)
Drop table T1;
Create table T1(Name varchar(100));
Insert T1 Values
('smith,steve'),
('smith,steve,j'),
('smith,ryan,tom');
UPDATE T1
SET Name=
CASE CHARINDEX(',',name, CHARINDEX(',',name)+1) WHEN
0 THEN Name
ELSE
LEFT(name,CHARINDEX(',',name, CHARINDEX(',',name)+1)-1)+' ' +
RIGHT(name,LEN(Name)-CHARINDEX(',',name, CHARINDEX(',',name)+1))
END
Select * from T1
答案 3 :(得分:0)
除了编写自己的用户定义函数之外,SQLServer中的字符串操作是有限的,但您可以在此处使用PARSENAME函数。它需要一个字符串,在句点字符上将其拆分,然后返回您指定的段。
试试这个:
DECLARE @name VARCHAR(100) = 'smith,ryan,tom'
SELECT REVERSE(PARSENAME(REPLACE(REVERSE(@name), ',', '.'), 1)) + ', ' +
REVERSE(PARSENAME(REPLACE(REVERSE(@name), ',', '.'), 2)) +
COALESCE(' ' + REVERSE(PARSENAME(REPLACE(REVERSE(@name), ',', '.'), 3)), '')
结果:史密斯,瑞安汤姆
如果你将@name设置为&#39; smith,steve&#39;相反,你会得到:
结果:史密斯,史蒂夫
段1实际上为您提供最后一段,段2为倒数第二段等。因此我使用REVERSE来获取您想要的订单。在&#39; steve,smith&#39;的情况下,段3将为空,因此如果是这种情况,COALESCE将添加空字符串。 REPLACE当然会将逗号更改为句点,以便拆分起作用。
请注意,这有点像黑客。如果有超过四个部分,则PARSENAME将不起作用,如果名称恰好包含句点,则会失败。但是,如果您的数据符合这些限制,希望它能为您提供解决方案。
答案 4 :(得分:0)
警告:听起来您的数据格式可能不一致。在这种情况下,对其应用任何自动化处理将是有风险的。但是,您可以尝试:
UPDATE people SET name = REPLACE(name, ',', ' ')
UPDATE people SET name = LEFT(name, CHARINDEX(' ', name)-1)+ ', '
+ RIGHT(name, LEN(name) - CHARINDEX(' ', name)
这对你给出的三个例子都有效。它将对你的其他部分做些什么是另一个问题。
答案 5 :(得分:0)
以下是CHARINDEX()和SUBSTRING
的示例WITH yourTable
AS
(
SELECT names
FROM
(
VALUES ('smith,steve'),('smith,steve,j'),('smith,ryan,tom')
) A(names)
)
SELECT names AS old,
CASE
WHEN comma > 0
THEN SUBSTRING(spaced_names,0,comma + 1) --before the comma
+ SUBSTRING(spaced_names,comma + 2,1000) --after the comma
ELSE spaced_names
END AS new
FROM yourTable
CROSS APPLY(SELECT CHARINDEX(',',names,CHARINDEX(',',names) + 1),REPLACE(names,',',', ')) AS CA(comma,spaced_names)