Sql server 2008 Parsename、CharIndex或子字符串?

Sql server 2008 Parsename、CharIndex或子字符串?,sql-server-2008,Sql Server 2008,这就是我面临的困境,我有大约50000条记录,每一条记录都有一个原告和被告的名字,这两个名字都在一列中,我想把它们分为两列。名字的长度不同,就像名字一样,有些名字有前缀或后缀。除了前缀和后缀,这不应该是一个很难写的查询,但是我挂断的地方在字符串的中间。 我正在处理的数据格式如下: Column_Name John Doe V Elton John Jane Doe V Elton John David Smith V Elton John 我尝试编写一个查询,将“V”周围的名称分隔开来,希望

这就是我面临的困境,我有大约50000条记录,每一条记录都有一个原告和被告的名字,这两个名字都在一列中,我想把它们分为两列。名字的长度不同,就像名字一样,有些名字有前缀或后缀。除了前缀和后缀,这不应该是一个很难写的查询,但是我挂断的地方在字符串的中间。 我正在处理的数据格式如下:

Column_Name
John Doe V Elton John
Jane Doe V Elton John
David Smith V Elton John 
我尝试编写一个查询,将“V”周围的名称分隔开来,希望我的目标数据最终会是这样的:

原告|被告|姓名
约翰·多伊|埃尔顿·约翰|

但是,当我告诉它用“”替换“v”时,它会用空格替换字符串中的每个v。非常感谢你们提供的任何建议

谢谢


Nathaniel Block

您可以替换“v”,包括空格以保护字符串中的“v”,但如果它没有点或第五个后缀,则可能会丢失中间首字母。

因为在对原始问题的评论中指出,任何名称都不会有“v”后缀,您可以使用CHARINDEX查找“V”(即space-V-space)的位置,然后使用子字符串获取这两个部分:

;WITH cte AS
(
    SELECT  tmp.COLUMN_NAME,
            tmp.OTHER_FIELD,
            CHARINDEX(' V ', tmp.COLUMN_NAME) AS [DelimiterPosition]
    FROM (
            SELECT 'John Doe V Elton John', 23
            UNION ALL
            SELECT 'Jane Doe V Elton John', 78922
            UNION ALL
            SELECT 'David Smith V Elton John', 932
            UNION ALL
            SELECT 'David Doe 5th v Elton John', 53
        ) AS tmp(COLUMN_NAME, OTHER_FIELD)
)
SELECT  cte.COLUMN_NAME,
    SUBSTRING(cte.COLUMN_NAME, 1, (cte.DelimiterPosition - 1)) AS [Plaintiff],
    SUBSTRING(cte.COLUMN_NAME, (cte.DelimiterPosition + 3), 500) AS [Defendant],
        cte.OTHER_FIELD
FROM cte
输出:

COLUMN_NAME                 Plaintiff      Defendant    OTHER_FIELD
John Doe V Elton John       John Doe       Elton John   23
Jane Doe V Elton John       Jane Doe       Elton John   78922
David Smith V Elton John    David Smith    Elton John   932
David Doe 5th v Elton John  David Doe 5th  Elton John   53

所有这些示例数据是否都在一行的
列\u Name
中<代码>John Doe V Elton John Jane Doe V Elton John David Smith V Elton John没有,先生,有多行。即John Doe诉Elton John是第一排的原告和被告。第二排有不同的原告/被告姓名,如Jane Doe V Elton John。你说有些姓名有后缀。是否可能有一个后缀“V”表示“第五”?如果是这样的话,在“V”上进行简单的拆分会很棘手,特别是如果左边的名字有“V”,那么这个名字就是“John Doe,V V Elton John”。我编辑了这个问题,将列名和3行放入代码示例格式中。srutzky,谢天谢地,这里没有“V”的后缀。大多数后缀只是“第一个”或“第二个”纯粹的妄想症:这将捕获字符串中“V”的第一个实例。第二次扫描可以在被诉人栏中找到更多的'V'实例,以确保没有任何.srutzky,正如你已经知道的,这是有效的!非常感谢你今天的帮助。Jayvee,DMason,感谢您的评论,我将能够清理这些数据并将其拆分为我现在需要拆分的列。没有你,我不可能做到all@user3495301:欢迎光临。如果这个答案对你有效,请记住将其标记为已接受答案。谢谢