Регулярное выражение для нахождения всех имен таблиц в запросе

Один ответ лайнера является localeCompare()

const ary = ["Kevin", "brandy", "Andrew"];
ary.sort(function (a, b) {
    return a.toLowerCase().localeCompare(b.toLowerCase());
});
console.log(ary);

8
задан wonea 11 August 2016 в 16:05
поделиться

7 ответов

RegEx не очень хорош в этом, поскольку это намного более сложно, чем это появляется:

  • Что, если они используют СЛЕВА/СПРАВА ВНУТРЕННИЕ/ВНЕШНИЕ/ПЕРЕКРЕСТНЫЕ/СЛИЯНИЯ/ЕСТЕСТВЕННЫЕ соединения вместо a, b синтаксис? A, b синтаксис нужно избежать так или иначе.
  • Что относительно вложенных запросов?
  • Что, если нет никакой таблицы (выбирающий константу)
  • Что относительно разрывов строки и другого пробельного форматирования?
  • Имена псевдонима?

Я мог бы продолжать.

То, что можно сделать, ищут sql синтаксический анализатор и выполняют запрос через это.

13
ответ дан 5 December 2019 в 06:10
поделиться

Я нашел этот сайт, который имеет БОЛЬШОЙ синтаксический анализатор!

http://www.sqlparser.com/

вполне достойно. Работы обработка.

2
ответ дан 5 December 2019 в 06:10
поделиться

Все сказало о полноценности такого regex в контексте SQL. Если Вы настаиваете на regex, и Ваши SQL-операторы всегда похожи на тот, который Вы показали (который не означает подзапросов, соединений, и так далее), Вы могли использовать

FROM\s+([^ ,]+)(?:\s*,\s*([^ ,]+))*\s+ 
5
ответ дан 5 December 2019 в 06:10
поделиться

Это определенно не легко.

Рассмотрите подзапросы.

select
  *
from
  A
  join (
    select
       top 5 *
    from
      B)
    on B.ID = A.ID
where
  A.ID in (
    select
      ID
    from
      C
    where C.DOB = A.DOB)

Существует три таблицы, используемые в этом запросе.

1
ответ дан 5 December 2019 в 06:10
поделиться

Я думаю, что было бы легче маркировать строку и искать ключевые слова SQL, которые могли, связал имена таблиц. Вы знаете, что имена будут следовать FROM, но они могли сопровождаться WHERE, GROUP BY, HAVING, или никакое ключевое слово вообще, если они в конце запроса.

1
ответ дан 5 December 2019 в 06:10
поделиться

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

К тому же, если запрос включает ссылку на представление или UDF, информация о том, какие таблицы лежат в основе, вообще не будет содержаться в строке, что делает совершенно непрактичным получение этой информации путем ее разбора. Кроме того, вам придется проявить смекалку, чтобы обнаружить временные таблицы и исключить их из результатов.

Если вы должны это сделать, то лучшим подходом будет использование API для конкретного механизма базы данных, для которого предназначен SQL. Например, вы можете создать представление на основе запроса, а затем использовать API DB Server для обнаружения зависимостей для этого представления. Движок БД сможет разобрать его гораздо надежнее, чем вы когда-либо сможете это сделать без огромных усилий по реинжинирингу движка запросов.

Если вы случайно работаете с SQL Server, вот статья об обнаружении зависимостей на этой платформе: Finding Dependencies in SQL Server 2005

0
ответ дан 5 December 2019 в 06:10
поделиться

Я довольно поздно пришел на вечеринку, однако я подумал, что поделюсь регулярным выражением, которое я использую в настоящее время для анализа всех наших объектов базы данных, и я не согласен с мнением, что это невозможно сделать с его помощью.

Регулярное выражение имеет несколько допущений

1) Вы не используете стиль синтаксиса соединения A, B

2) Какой бы синтаксический анализатор регулярного выражения вы ни использовали, он поддерживает игнорирование регистра.

3) Вы анализируете, выбираете, объединяете, обновляете, удаляет и усекает. Он не поддерживает вышеупомянутые MERGE / NATURAL, потому что мы их не используем, однако я уверен, что дополнительную поддержку добавить не составит труда.

Мне интересно знать, частью какого типа транзакции является таблица, поэтому я включил группы именованного захвата, чтобы сообщить мне об этом.

Я давно не использую регулярные выражения, поэтому, вероятно, можно будет внести улучшения, но пока что во всех моих тестах это верно.

\bjoin\s+(?<Retrieve>[a-zA-Z\._\d]+)\b|\bfrom\s+(?<Retrieve>[a-zA-Z\._\d]+)\b|\bupdate\s+(?<Update>[a-zA-Z\._\d]+)\b|\binsert\s+(?:\binto\b)?\s+(?<Insert>[a-zA-Z\._\d]+)\b|\btruncate\s+table\s+(?<Delete>[a-zA-Z\._\d]+)\b|\bdelete\s+(?:\bfrom\b)?\s+(?<Delete>[a-zA-Z\._\d]+)\b
3
ответ дан 5 December 2019 в 06:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: