我正在运行一系列SQL查询来查找需要清理的数据。其中一个我想做的是寻找:
例如,我的名字应该是" John Doe"。我希望它能找到" JOhn Doe"或" JOHN DOE"或者" John doe",但我不希望它找到" John Doe"因为格式正确。
我正在使用SQL Server 2008。
答案 0 :(得分:3)
关键是使用区分大小写的排序规则,即Latin1_General_BIN
* 。然后,您可以使用LIKE
expression的查询,如下所示(SQL Fiddle demo):
select *
from foo
where name like '%[A-Z][A-Z]%' collate Latin1_General_BIN --two uppercase in a row
or name like '% [a-z]%' collate Latin1_General_BIN --space then lowercase
* 根据How do I perform a case-sensitive search using LIKE?,显然Latin1_General_CS_AS
排序规则中存在“错误”,其中[A-Z]
等范围不区分大小写。解决方案是使用Latin1_General_BIN
。
答案 1 :(得分:1)
您可以使用正则表达式。我不是SQL Server专家,但您想使用RegexMatch。像这样:
select columnName
from tableName
where dbo.RegexMatch( columnName,
N'[A-Z]\W[A-Z]' ) = 1
答案 2 :(得分:1)
首先,我认为你应该创建一个返回正确名称的函数(听起来你还需要一个)。请参阅“正确套管人员姓名”标题下的here。然后找到那些不匹配的。
SELECT Id, Name, dbo.ProperCase(Name)
FROM MyTable
WHERE Name <> dbo.PoperCase(Name) collate Latin1_General_BIN
这将帮助您清理数据并根据需要调整功能。
答案 3 :(得分:0)
如果您的目标是更新列以大写每个单词的第一个字符(在您的情况下为firstName和lastName),则可以使用以下查询。
创建包含数据的示例表
Declare @t table (Id int IDENTITY(1,1),Name varchar(50))
insert into @t (name)values ('john doe'),('lohn foe'),('tohnytty noe'),('gohnsdf fgedsfsdf')
更新查询
UPDATE @t
SET name = UPPER(LEFT(SUBSTRING(Name, 1, CHARINDEX(' ', Name) - 1), 1)) + RIGHT(SUBSTRING(Name, 1, CHARINDEX(' ', Name) - 1), LEN(SUBSTRING(Name, 1, CHARINDEX(' ', Name) - 1)) - 1) +
' ' +
UPPER(LEFT(SUBSTRING(Name, CHARINDEX(' ', Name) + 1, 8000), 1)) + RIGHT(SUBSTRING(Name, CHARINDEX(' ', Name) + 1, 8000), LEN(SUBSTRING(Name, CHARINDEX(' ', Name) + 1, 8000)) - 1)
FROM @t
输出
SELECT * FROM @t
Id Name
1 John Doe
2 Lohn Foe
3 Tohnytty Noe
4 Gohnsdf Fgedsfsdf
答案 4 :(得分:0)
我用这种方式:
;WITH yourTable AS(
SELECT 'John Doe' As name
UNION ALL SELECT 'JOhn Doe'
UNION ALL SELECT 'JOHN DOE'
UNION ALL SELECT 'John doe'
UNION ALL SELECT 'John DoE'
UNION ALL SELECT 'john Doe'
UNION ALL SELECT 'jOhn dOe'
UNION ALL SELECT 'jOHN dOE'
UNION ALL SELECT 'john doe'
)
SELECT name
FROM (
SELECT name,
LOWER(PARSENAME(REPLACE(name, ' ', '.'), 1)) part2,
LOWER(PARSENAME(REPLACE(name, ' ', '.'), 2)) part1
FROM yourTable) t
WHERE name COLLATE Latin1_General_BIN = UPPER(LEFT(part1,1)) + RIGHT(part1, LEN(part1) -1) +
' ' + UPPER(LEFT(part2,1)) + RIGHT(part2, LEN(part2) -1)
注意:强>
这对于更多的两个分开的名称来说是好的,它应该得到改善。