#sql #sql-server #sql-server-2019
#sql #sql-сервер #sql-сервер-2019
Вопрос:
Я использую SQL Server 2019 и пытаюсь отладить свою ProperCase
функцию, которая преобразует строки в правильный регистр.
У меня есть таблица, для создания которой я использовал свою функцию, содержащая все varchar
столбцы, один из которых назван Surname
.
Я хочу выбрать строки, в которых Surname
содержится три или более заглавных буквы в строке.
Я искал этот сайт, Google и т. Д., И есть множество примеров для поиска, где в поле есть какие-либо заглавные буквы или нет заглавных букв, но это немного сложнее.
Столбец может содержать любое общее количество прописных или строчных букв, но я хочу выбрать только те строки, в которых он содержит три или более прописных буквы рядом друг с другом.
Может ли здесь работать регулярное выражение?
Ответ №1:
На самом деле нет поддержки регулярных выражений в SQL Server изначально, если вы не хотите устанавливать пользовательские объекты CLR. Если ваши данные хранятся без учета регистра и вы хотите выполнять поиск с учетом регистра, один из способов — использовать 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
. Не то чтобы это нормально, но данные не являются нормальными и хотят, чтобы вы понимали спецификацию товара.
Комментарии:
1. Умно! Полностью собираюсь использовать эту логику.
2. Идеальный, потрясающий ответ. Я в замешательстве, хотя вы говорите, что в SQL изначально нет поддержки регулярных выражений, но затем вы используете это в своем коде: ‘[A-Z]’, который является регулярным выражением?
3. @Geoff Я имею в виду, что это настолько ограничено, что вы едва ли можете назвать это поддержкой (я сказал «На самом деле никакой поддержки», а не «Нет поддержки». Попробуйте сделать что-то даже более сложное, чем это, и вы будете рвать на себе волосы.
4. Понял вас. Это также очень хороший совет, поскольку тот факт, что вы можете использовать некоторые регулярные выражения, заставляет вас думать, что вы могли бы использовать любое регулярное выражение для решения этой проблемы. Я начал процесс разрыва.