Sql 如何查找多个大写字符

Sql 如何查找多个大写字符,sql,sql-server,sql-server-2008,tsql,case-sensitive,Sql,Sql Server,Sql Server 2008,Tsql,Case Sensitive,我正在运行一系列SQL查询来查找需要清理的数据。我想做的一件事是寻找: 一行中有2个或多个大写字母 以小写字母开头 空格然后是小写字母 例如,我的名字应该是约翰·多伊。我希望它能找到JOhn Doe或JOhn Doe或JOhn Doe,但我不希望它能找到JOhn Doe,因为它的格式是正确的 我使用的是SQL Server 2008。关键是使用区分大小写的排序规则,即Latin1_General_BIN*。然后,您可以使用具有类似以下内容的查询: *根据,显然在Latin1_General_CS

我正在运行一系列SQL查询来查找需要清理的数据。我想做的一件事是寻找:

一行中有2个或多个大写字母 以小写字母开头 空格然后是小写字母 例如,我的名字应该是约翰·多伊。我希望它能找到JOhn Doe或JOhn Doe或JOhn Doe,但我不希望它能找到JOhn Doe,因为它的格式是正确的


我使用的是SQL Server 2008。

关键是使用区分大小写的排序规则,即Latin1_General_BIN*。然后,您可以使用具有类似以下内容的查询:


*根据,显然在Latin1_General_CS_As排序规则中有一个bug,[a-Z]等范围不区分大小写。解决方案是使用拉丁语1\u General\u BIN。

如果您的目标是更新列以大写大写字母表示案例中每个单词的第一个字符firstName和lastName,则可以使用以下查询

创建包含数据的示例表

更新查询

输出


可以使用正则表达式。我不是SQL Server高手,但你想使用。大概是这样的:

select columnName
from tableName
where dbo.RegexMatch( columnName, 
        N'[A-Z]\W[A-Z]' ) = 1

首先,我认为你应该让一个函数返回一个合适的名字,听起来你无论如何都需要一个。请参见标题“适当的大小写”下的人员姓名。然后找到不匹配的

SELECT Id, Name, dbo.ProperCase(Name)
FROM MyTable
WHERE Name <> dbo.PoperCase(Name)  collate Latin1_General_BIN
这将帮助您清理数据并根据需要调整函数。

我使用以下方法:

;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)
注: 这将有利于两个部分的名称,更多,它应该改进


那么JRR Tolkien呢?[更多细节:]这个答案需要一个链接文章中定义的UDF@shA.t关于第二条评论:完成。至于UDF:我在SQL Server上已经有点力不从心了——我自己也是一个MySQL的家伙。除此之外,我现在只是在移动设备上消磨时间。所以,恐怕这超出了我今晚的专业知识范围我很欣赏这个更新功能,但现在只是寻找一个选择查询。没有问题。希望以后能有用。
SELECT * FROM @t

Id  Name
1   John Doe
2   Lohn Foe
3   Tohnytty Noe
4   Gohnsdf Fgedsfsdf
select columnName
from tableName
where dbo.RegexMatch( columnName, 
        N'[A-Z]\W[A-Z]' ) = 1
SELECT Id, Name, dbo.ProperCase(Name)
FROM MyTable
WHERE Name <> dbo.PoperCase(Name)  collate Latin1_General_BIN
;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)