选择列在一行中包含三个大写字母的位置

Geo*_*ald 0 sql sql-server sql-server-2019

我正在使用 SQL Server 2019 并尝试调试ProperCase将字符串转换为正确大小写的函数。

我有一个表,我使用我的函数创建了它,其中包含所有varchar列,其中一个名为Surname.

我想选择一行中Surname包含三个或更多大写字母的行。

我搜索这个网站和谷歌等,并有大量的例子查找那里有任何大写字母或没有在现场大写字母,但是这是一个有点比这更微妙。

该列可以包含任意总数的大写或小写字母,但我只想选择包含三个或更多大写字母的行。

正则表达式可以在这里工作吗?

Aar*_*and 6

除非您想安装自定义 CLR 对象,否则 SQL Server 本身并没有真正的任何正则表达式支持。如果您的数据存储为不区分大小写并且您想要执行区分大小写的搜索,一种方法是COLLATE对列使用子句。

DECLARE @x TABLE(i int, surname nvarchar(500));

INSERT @x(i, surname) VALUES
    (1, 'this is not a match'),
    (2, 'this is a MATCH'),
    (3, 'this is not a match'),
    (4, 'this is DEFINITELY a match');
    
DECLARE @min int = 3;

SELECT i, surname
  FROM @x
  WHERE surname COLLATE Latin1_General_BIN2 
  LIKE N'%' + REPLICATE(N'[A-Z]', @min) + N'%';
Run Code Online (Sandbox Code Playgroud)

结果:

i      surname
----   -----------------------------
2      this is a MATCH
4      this is DEFINITELY a match
Run Code Online (Sandbox Code Playgroud)

此 dbfiddle还演示了其他值@min(如果您想在一行中识别4、40或 300 个连续的大写字符)。

请注意,这不会表现得很好,所以希望这不是你经常和大规模做的事情。它也不会在大写字符之间找到带有其他字符的姓氏,例如Van DE MoorMC-Adams。不是那些是正常的,而是数据不正常,要你了解货单。