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



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

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

我想选择Surname在一行中包含三个或三个以上大写字母的行。

我搜索过这个网站和谷歌等,有很多例子可以找到字段中有任何大写字母或没有小写字母的地方,但这比这更微妙。

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

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

除非您想安装自定义CLR对象,否则SQL Server本机并不支持任何regex。如果数据存储为不区分大小写,并且希望执行区分大小写的搜索,一种方法是对列使用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'%';

结果:

i      surname
----   -----------------------------
2      this is a MATCH
4      this is DEFINITELY a match

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

请注意,这不会表现得很好,所以希望这不是你经常做的事情。此外,它不会在大写字符之间找到其他字符的姓氏,如Van DE MoorMC-Adams。并不是说这些都是正常的,而是数据不正常,希望你了解货物清单。

最新更新