1

所以我有一个客户数据库。我运行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()来提取所有名称。我不知道如何使用它,希望我能得到一些帮助。

4

2 回答 2

1

我怀疑你的代码有TRY/CATCH或者你正在吞咽/抑制/忽略错误。你应该得到 4 行,然后是一个丑陋的错误消息:

消息 537,级别 16,状态 2
传递给 LEFT 或 SUBSTRING 函数的长度参数无效。

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

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
于 2013-10-23T18:57:26.857 回答
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;

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

于 2013-10-23T18:59:21.650 回答