Комментарии 11
В далеких нулевых я для этого писал библиотеку на Java. Oracle прекрасно работает с jar-файлами
# создаем JAR-файл в Java
jar cvf MyJavaLib.jar MyJavaLib.class
# загружаем Java-класс в базу данных Oracle
loadjava -user username/password@db -resolve MyJavaLib.jar
# создаем функциюis_even
в Oracle, которая использует Java
CREATE OR REPLACE FUNCTION is_even(number IN NUMBER) RETURN BOOLEAN AS LANGUAGE JAVA NAME 'MyJavaLib.isEven(I)';
# пользуемся
SELECT * FROM my_table WHERE is_even(my_column) = TRUE;
Нюансы синтаксиса
Обратите внимание на различия в экранировании символов и использовании спец. последовательностей: ...
Пример: ...
В примере вообще нет слэшей, не используется экранирование или специальные последовательности. Похоже при редактировании \ потерялись?
а similar_to почему не упоминаете? это же тоже регулярка
О pg_trgm забыли упомянуть. А это ведь очень мощный механизм, причем поддерживающий индексацию.
Допустим, есть таблица
users
с полем
Типичная ошибка тех, кто бездумно переписывает у соседа, не озаботившись проверить переписанное на истинность. А списанное - оно неправильное, неверное. Вы хоть стандарт-то читали?
Валидация e-mail - это крайне сложная тема, и при реализации в соответствии со всеми требованиями стандарта получается паттерн длиной более 10 килобайт. А если не потратить кучу времени на оптимизацию - то намного более...
Стандартизация номеров телефонов
И опять та же история. Копипаст без понимания и проверки. Объяснения - только ухудшают ситуацию. Потому что они либо ошибочны, либо написаны для весьма частного, специфического набора данных.
Основные функции для работы с регулярными выражениями в SQL
Обожаю подобные статьи, такие чтобы тап-тап-тап в корпоративный блог. Потому что если мы говорим о стандарте SQL99 это одно, если о конкретной реализации это другое. Догадайся, читатель сам, что большинство написанного справедливо, к примеру, для ORACLE и их же MySQL, но в том же подмножестве TSQL ничего подобного нет, там (из коробки) отношение к пользователю "PATINDEX или ну да, ну да.. пошел я нахер"
Я не прям чтоб спец по регуляркам и когда попытался разобрать то что написано в самом начале, то возник вопрос:
^+?7?\d{10}$ — выбираем номера, которые уже могут начинаться с +7 или 7, чтобы избежать дублей кода страны.
Разве оно не зацепит телефоны и с +7 и, например, с +5?
Типа, у нас может быть один + и одна 7, а может и не быть. В итоге пройдет как +71234567890, так и +5123456789
Нигде не упомянут Clickhouse. Вот вам процессор шаблонов на SQL:
replaceRegexpAll(replaceRegexpAll(arrayStringConcat(
arrayMap(x -> if(has(mapKeys(subst), x), subst[x], x ),
splitByRegexp('[@]', P.v))), -- delimiter chars set here
'((/\\*([^*]|[\r\n]|(\\*+([^*/]|[\r\n])))*\\*+/)|(--.*))', ''), '([\r\n]+)',
' ')
делает замены @xxx@ переменных, убирает комментарии и переводы строк.
Написано много лет назад, руками, без ChatGPT
Регулярные выражения в SQL