我正在使用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 Moor
或MC-Adams
。并不是说这些都是正常的,而是数据不正常,希望你了解货物清单。