Найти символы за пределами указанного диапазона символов - PullRequest
0 голосов
/ 21 февраля 2019

Я хочу найти символы, которые не разрешены в столбце.Допустимые символы:

AZ
0-9
Пробел (CHAR 32)
- (CHAR 45)

Так что все остальное не разрешено в столбце VARCHAR RegNo,Но проблема в том, что в последние годы не было фильтрации входных данных.Поэтому все виды странных символов хранятся в базе данных.

Я хочу найти эти случаи и исправить их.Итак, моя первая попытка

select regno from vehicle where regno like '%[^A-Z][^0-9][^-][^' + char(32) + ']%'

Результат

Wiiks Luleå
SCÖ-01
NCÅ-01
668 AOJ
016 KMW
049 KMW

Итак, первая строка в порядке, так как содержит 'å'

Но почему 668 AOJ, 016 KMW, 049 KMW

Ответы [ 2 ]

0 голосов
/ 21 февраля 2019

У вас есть несколько проблем здесь.Во-первых, вы должны использовать один класс символов регулярных выражений, а не несколько из них, которые пытаются сопоставить несколько разных символов.Далее, у вашего диапазона есть проблема.Попробуйте эту версию:

SELECT regno
FROM vehicle
WHERE regno LIKE '%[^A-Z0-9 ' + CHAR(32) + '-' + CHAR(44) + '-]%';

Для объяснения вышеуказанного диапазона он соответствует любому regno, в котором есть символ, который не заглавная буква, число, пробел илив диапазоне CHAR(32) - CHAR(44).Обратите внимание, что CHAR(45) сам по себе является дефисом, который мы можем поместить в самый диапазон диапазона, чтобы включить его.

Демо

Обратите внимание, что в приведенной выше демонстрации только окончательная запись не соответствует вашему шаблону.

0 голосов
/ 21 февраля 2019

Вы используете классы персонажей неправильно.Например, %[^A-Z][^0-9]% будет соответствовать x y, где пробел соответствует [^A-Z], а y соответствует [^0-9].Объедините их вместе, как:

WHERE RegNo LIKE '%[^A-Z0-9\- ]%' ESCAPE '\'
WHERE RegNo LIKE '%[^ABCDEFGHIJKLMNOPQRSTUVWXYZ0-9\- ]%' ESCAPE '\'

Примечания:

  • Символы ^-] должны быть экранированы при использовании внутри []
  • Диапазон символов может включать в себядополнительные символы, такие как акценты.При необходимости укажите набор вместо диапазона.
...