删除数据中的第二个逗号

时间:2015-06-26 22:20:15

标签: sql sql-server tsql

好的,我有一个名为PEOPLE的表,它有一个名称列。在名称列中是一个名称,但它完全是一团糟。由于某种原因,它没有列出如上,第一中间。它坐在最后,第一,中间和最后一个(和中间,如果有)用逗号隔开。如果这个人有中间名,则两个逗号。

示例:

     smith,steve
     smith,steve,j
     smith,ryan,tom

我希望第二个逗号被删除(解析原因)空格放在现有的第一个逗号之后,所以上面的内容看起来像:

    smith, steve
    smith, steve j
    smith, ryan tom

最终,我希望能够将名称解析为名字,中间名和姓名字段,但这是另一个帖子:_0。我感谢任何帮助。

谢谢。

6 个答案:

答案 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)