使用patindex解析列以翻转名称

时间:2013-10-23 18:44:33

标签: sql-server parsing patindex

所以我有一个客户数据库。我运行SELECT * FROM MyTable它给了我几列,其中一列是名称。看起来像这样:

"Doe, John"
"Jones, Bill"
"Smith, Mike"
"Johnson, Bob"
"Harry Smith"
"Black, Linda"
"White, Laura"

等。有些是姓,名字。其他人是名字的第一名。

我的老板要我翻转名字,这样他们才是最后一个。

所以我跑了这个:

SELECT SUBSTRING(Column_Name, CHARINDEX(',', Column_Name) + 2, LEN(Name) - CHARINDEX(',',  Column_Name) + 1) + ' ' + SUBSTRING(Column_Name, 1, CHARINDEX(',', Column_Name) - 1) FROM MyTable

问题在于,当我运行它时,它只会运行名称,直到找到一个不需要翻转的名称。所以在上面的例子中,它只会给我前四个名字,而不是全部。

有人告诉我,我可以使用PATINDEX()来取出所有名字。我不知道如何使用它,并希望我能得到一些帮助。

2 个答案:

答案 0 :(得分:1)

我怀疑您的代码有TRY/CATCH,否则您正在吞咽/抑制/忽略错误。你应该得到4行,然后是一个很难看的错误信息:

  

Msg 537,Level 16,State 2   
传递给LEFT或SUBSTRING函数的长度参数无效。

问题是您的表达式假定,始终存在。您需要通过过滤掉不包含,的行来满足这一要求(尽管这不是很可靠,因为表达式可以在过滤器之前尝试),或者通过以下方式,您可以根据是否找到,来决定如何重新组合字符串:

DECLARE @x TABLE(y VARCHAR(255));

INSERT @x VALUES
('Doe, John'),
('Jones, Bill'),
('Smith, Mike'),
('Johnson, Bob'),
('Harry Smith'),
('Black, Linda'),
('White, Laura');

SELECT LTRIM(SUBSTRING(y, COALESCE(NULLIF(CHARINDEX(',',y)+2,2),1),255))
 + RTRIM(' ' + LEFT(y, COALESCE(NULLIF(CHARINDEX(',' ,y)-1,-1),0)))
FROM @x;

结果:

John Doe
Bill Jones
Mike Smith
Bob Johnson
Harry Smith
Linda Black
Laura White

答案 1 :(得分:0)

在这种情况下您不需要PATINDEX,尽管可以使用它。我会用你的表达式翻转名称并将其放在CASE表达式中。

DECLARE @MyTable TABLE
(
   Name VARCHAR(64) NOT NULL
);

INSERT @MyTable(Name)
VALUES
   ('Doe, John'),
   ('Jones, Bill'),
   ('Smith, Mike'),
   ('Johnson, Bob'),
   ('Harry Smith'),
   ('Black, Linda'),
   ('White, Laura');

SELECT
   CASE
      WHEN CHARINDEX(',', Name, 1) = 0 THEN Name
      ELSE SUBSTRING(Name, CHARINDEX(',', Name) + 2, LEN(Name) - CHARINDEX(',',  Name) + 1)
         + ' ' + SUBSTRING(Name, 1, CHARINDEX(',', Name) - 1)
   END AS [Name]
FROM @MyTable;

如果没有使用逗号,则第一个条件只返回原始值。