Регулярное выражение для поиска полей SQL-запроса

#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. Никаких забот вообще! Надеюсь, это поможет. Удачи! (: