#sql #regex #postgresql
#sql #регулярное выражение #postgresql
Вопрос:
У меня есть репозиторий SQL-запросов, и я хочу понять, какие запросы используют определенные таблицы или поля.
Допустим, я хочу понять, какие запросы используют поле электронной почты, как я могу его написать?
Пример SQL-запроса:
select
users.email as email_user
,users.email as email_user_too
,email as email_user_too_2
email as email_user_too_3,
back_email as wrong_email -- wrong field
from users
Комментарии:
1. Что это за хранилище такое? (храните ли вы запросы в файлах sql? или как хранимые процедуры? взгляды?)
2. Я храню необработанные запросы к базе данных
3. Я понимаю. Как вы их храните?
4. То есть человек написал запрос, выполнил его, и он был сохранен в виде текста в файле, да
5. Хорошо — тогда сохраняйте в виде текстовых файлов. А теперь — помогите мне понять, вы пытаетесь найти поле с неправильным псевдонимом? (где back_mail <> wrong_mail?)
Ответ №1:
Итак, чтобы точнее сформулировать проблему, вы просматриваете список SQL-запросов [в виде текста], и теперь вам нужно найти запросы, которые используют определенные поля, используя SQL amp; RegEx
(Регулярные выражения) PostgreSQL
. (пожалуйста, пометьте вопрос, чтобы StackOverflow правильно индексировал ваш вопрос, что еще более важно, чтобы у читателей было больше контекста по этому вопросу)
PostgreSQL имеет поддержку регулярных выражений OOTB (из коробки). Поэтому мы пропускаем изучение других способов сделать это. (Если вы читаете это как пользователь Microsoft SQL Server, то я настоятельно рекомендую вам прочитать эту блестящую статью на веб-сайте Microsoft об определении табличного UDF (определяемой пользователем функции))
Самый простой способ, который я мог придумать для решения вашей проблемы, — это сначала выбросить из текста запроса то, что нам не нужно, а затем отфильтровать то, что осталось.
Таким образом, после удаления ненужного материала у вас останется набор «токенов», которые вы можете легко фильтровать, и я помещаю токен в кавычки, поскольку мы на самом деле не анализируем язык SQL, но если бы мы это сделали, это было бы первым шагом: извлечь токены.. (:
Возьмем, к примеру, этот запрос:
With Queries (
Id
, QueryText
) As (
values (1, 'select
users.email as email_user
,users.email as email_user_too
,email as email_user_too_2,
email as email_user_too_3,
back_email as wrong_email -- wrong field
from users')
)
Select QueryText
, found
From (
Select Id
, QueryText
, regexp_split_to_table (QueryText, '(--[sw] |select|from|as|where|[ sn,])') As found
From Queries
) As Result
Where found != ''
And found = 'back_email'
- Я использовал концепцию «репозитория запросов» с
WITH
инструкцией для простоты выполнения псевдокода. - Я также выбрал несколько слов / символов для разделения
QueryText
. Напримерselect
, и т.д.where
Они нам не нужны в нашем «найденном» наборе. - И в конце, как вы можете видеть выше, я просто использовал
found
как то, что осталось, и отфильтровал его по имени поля, которое вы ищете. (Предполагая, что вы знаете поле, которое ищете)
Вы могли бы улучшить регулярное выражение, которое я сделал, или изменить метод по своему усмотрению, чтобы сделать его лучше. Но я думаю, что общая концепция отражает то, чего вам нужно достичь. Одна из проблем, которую я вижу в своем решении сразу, заключается в том, что вы можете искать что угодно, а не только имена выбранных полей, что вызывает вопрос: зачем использовать регулярные выражения, а не Like
операторы? Но опять же, как я уже упоминал, вы можете улучшить регулярное выражение и учесть конкретные требования, которые могут у вас возникнуть. Использование Like
может ограничить вас в этом направлении. (Другими словами, только вы знаете, что для вас хорошо. Я не могу сказать этого отсюда.)
Вы можете поиграть с запросом онлайн здесь: db-fiddle query и использовать https://regex101.com / для тестирования вашего регулярного выражения.
Отказ от ответственности Я не являюсь разработчиком PostgreSQL. Должны быть другие, возможно, лучшие способы сделать это. (:
Комментарии:
1. Никаких забот вообще! Надеюсь, это поможет. Удачи! (: