所以我有一个客户数据库。我运行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()
来取出所有名字。我不知道如何使用它,并希望我能得到一些帮助。
答案 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;
如果没有使用逗号,则第一个条件只返回原始值。