PATINDEX не распознает точку и запятую

У меня есть столбец, который должен содержать номера телефонов, но он содержит все, что хотел пользователь. Мне нужно создать обновление, чтобы удалить все символы после недопустимого символа.

Для этого я использую регулярное выражение как PATINDEX('%[^0-9+-/()" "]%', [MobilNr]), и оно, казалось, работало, пока у меня не было некоторых чисел как +1235, 36446, и, к моему удивлению, результат равен 0 вместо 6. Также, если число содержит ., оно возвращает 0.

Игнорирует ли PATINDEX точку ("".") и запятую ("",")? Есть ли другие символы, которые PATINDEX будет игнорировать?


person Dan    schedule 07.11.2019    source источник
comment
Не совсем уверен, что вы спрашиваете здесь. Если бы вы могли отредактировать свой вопрос, включив в него образцы данных (как DDL+DML!), ваш текущий оператор и ожидаемые результаты, которые быть великим.   -  person Zohar Peled    schedule 07.11.2019
comment
Почему важны DDL и DML? Попробуйте SELECT PATINDEX('%[^0-9+-/() ]%', '+1235, 36446') и результат будет 0 вместо 6, который является индексом ,. Из этого я понимаю, что PATINDEX или Regex игнорируют точку и запятую   -  person Dan    schedule 07.11.2019


Ответы (1)


Дело не в том, что PATINDEX игнорирует запятую и точку, это ваш шаблон создал эту проблему.

С PATINDEX символ дефиса (-) имеет особое значение - на самом деле это оператор, обозначающий включающий диапазон - например, 0-9 обозначает все цифры между 0 и 9 - поэтому, когда вы делаете +-/, это означает все символы между + и / ( включительно, конечно). Символы запятой и точки находятся в этом диапазоне, поэтому вы получаете этот результат.

Исправить шаблон легко: либо используйте | в качестве логического или, либо просто переместите дефис в конец шаблона:

SELECT PATINDEX('%[^0-9/()" "+-]%', '+1235, 36446') -- Result: 6
person Zohar Peled    schedule 07.11.2019