-- Create the test table
DECLARE @Test TABLE
(
ID int NOT NULL PRIMARY KEY IDENTITY(1,1),
[Name] nvarchar(100) NOT NULL
);
-- Create the prefix table
DECLARE @prefix TABLE
(
ID int NOT NULL PRIMARY KEY IDENTITY(1,1),
Prefix nvarchar(100) NOT NULL
);
-- Insert test data
INSERT @Test([Name]) VALUES ( N'Mr Edison' ), ( N'Mrs Rosenbaum' ), ( N'Lt McAllister' ),
( N'Mr. White' ),( N'Smith' ), ( N'John Meyer' ), ( N'Mr Mrson' ),
( N'Dr Jones' ),( N'Dr. Smith' ), ( N'Mrs John Meyer' ),('Ms B');
INSERT @prefix(Prefix) VALUES('Mr'),('Ms'),('Mrs'),('Lt'),('Dr');
接下来是一个显示我们将要执行的操作的查询:
-- Select statement that shows what we are doing
SELECT
t.Id,
OldName = t.[Name],
[NewName] = STUFF(t.[Name], CHARINDEX(p.Prefix+' ',t.[name])+LEN(p.Prefix), 0,'.')
FROM @Test AS t
JOIN @prefix AS p ON CHARINDEX(p.Prefix+' ',t.[name])>0;
结果:**
Id OldName NewName
---- --------------- ---------------
1 Mr Edison Mr. Edison
7 Mr Mrson Mr. Mrson
11 Ms B Ms. B
2 Mrs Rosenbaum Mrs. Rosenbaum
10 Mrs John Meye Mrs. John Meyer
3 Lt McAllister Lt. McAllister
8 Dr Jones Dr. Jones
UPDATE语句:**
UPDATE @Test
SET [Name] = STUFF(t.[Name], CHARINDEX(p.Prefix+' ',t.[name])+LEN(p.Prefix), 0,'.')
FROM @Test AS t
JOIN @prefix AS p ON CHARINDEX(p.Prefix+' ',t.[name])>0;
结果:**
ID Name
----- --------------------
1 Mr. Edison
2 Mrs. Rosenbaum
3 Lt. McAllister
4 Mr. White
5 Smith
6 John Meyer
7 Mr. Mrson
8 Dr. Jones
9 Dr. Smith
10 Mrs. John Meyer
11 Ms. B
2条答案
按热度按时间arknldoa1#
@Andres发布的内容应该可以解决这个问题。我喜欢将前缀存储在表中,这样当你想写一个新地址时就不需要更新代码了。借用Andres的代码,我把这个放在一起...
首先是样本数据和样本模式表:
接下来是一个显示我们将要执行的操作的查询:
请注意,我搜索的前缀后跟一个空格,以避免将"Mr. Wes Simson"更改为"Mr. Wes Sims.son"
mqkwyuun2#
我假设标题只在字符串的开头,它们总是被空格分隔开。
创建测试环境
更新行
结果行
| 识别号|姓名|
| - ------|- ------|
| 1个|爱迪生先生|
| 第二章|罗森鲍姆夫人|
| 三个|麦卡利斯特中尉|
| 四个|怀特先生|
| 五个|史密斯|
| 六个|约翰·迈耶|
| 七|先生|
清理