Parsename,CharIndex或子串?

时间:2014-04-03 19:33:26

标签: sql-server-2008

所以这就是我所面临的困境,我有大约5万条记录,每条记录都有一个原告&被告名称,这两个名称都在一列中,我想将它们解析成两个单独的列。这些名称的长度与名称不同,其中一些名称具有前缀或后缀。除了前缀和后缀之外,这不应该是一个难以编写的查询,但是我挂起的地方是在字符串的中间。 我正在使用的数据采用以下格式:

Column_Name
John Doe V Elton John
Jane Doe V Elton John
David Smith V Elton John 

我试图编写一个查询来分隔' V'希望我的目标数据最终看起来像这样:

Plaintiff_Name | Defendant_Name |
John Doe | Elton John |

然而,当我告诉它更换一个' v'用' '它用空格替换字符串中的每个V.我们非常感谢您提供的任何建议。

谢谢,

Nathaniel Block

2 个答案:

答案 0 :(得分:1)

由于在原始问题的评论中已经说明没有名称将具有“V”后缀,您可以使用CHARINDEX找到“V”的位置(即空间V空间)然后使用SUBSTRING以获得两个部分:

;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

答案 1 :(得分:0)

你可以替换' v'包括保护' v'在字符串中,如果它没有点或第5个后缀,你可能会丢失一个中间的首字母。