#sql #antlr
#sql #antlr
Вопрос:
Мне нужно написать программу, которая принимает базовую инструкцию SQL select и выводит XML-файл, который разбивает инструкцию на составные части (выходные столбцы, входные таблицы, объединение, группирование по, агрегации и т.д.). Как минимум, мне нужно поддерживать 2 таблицы в инструкции from, разные типы соединения, предложение where, group by и having. Если может поддерживаться более сложный sql (например, подзапросы), это бонус, но не обязательно.
Я проверил ANTLR, и это выглядит как крутая кривая обучения. Учитывая, что у меня есть возможность требовать, чтобы SQL был достаточно простым, должен ли я попытаться передать код вручную или мне следует погрузиться в мир ANTLR?
Комментарии:
1. «Это зависит». Хотя я не говорю «использовать ANTRL», поскольку есть другие альтернативы (мне нравится подход рекурсивного спуска или синтаксического анализатора-комбинатора), использование надлежащих методов синтаксического анализа — это единственный способ правильно обрабатывать даже относительно небольшое подмножество SQL. Конечно, если «это работает», то «это работает», и жизнь продолжается … с другой стороны, возможно, у кого-то уже есть проект на основе ANTLR, который анализирует требуемый SQL 🙂
2. Как насчет использования существующего анализатора SQL?
3. Чего вы на самом деле пытаетесь достичь? Если вы хотите оптимизировать свой запрос, вам следует ознакомиться с планом ОБЪЯСНЕНИЯ ваших баз данных. Или вы пытаетесь создать свой собственный движок SQL?
4. Если вам известен какой-либо код для другого подхода и вы можете направить меня к нему, это было бы здорово. То же самое касается существующего синтаксического анализатора, который я могу использовать. Это было бы здорово. но это должно быть что-то, что я могу модифицировать / воспроизводить в соответствии со своими потребностями.
5. Чего я пытаюсь достичь: не для движка sql, а для моего домашнего инструмента etl. Мне нужно иметь возможность записывать каждое объединение, фильтр, группировку по и т.д., Которые необходимо выполнить. Инструмент etl с выводом этих метаданных в виде SQL с надлежащим протоколированием и проверкой ошибок. У меня уже есть графический интерфейс для перетаскивания, чтобы получить то, что мне нужно. Но я хотел бы создать альтернативный подход для тех, кто знает SQL, чтобы сделать это быстрее. Они могли бы ввести SQL, программа проанализировала бы его в шагах метаданных для инструмента ETL. Короче говоря: я не хочу изобретать велосипед для синтаксического анализа SQL, если я могу помочь этому.
Ответ №1:
Я не думаю, что вам нужно изобретать такой анализатор sql с ANTLR. Вот пример, который декодирует инструкцию SQL select в метаданные:
SELECT e.last_name AS name,
e.commission_pct comm,
e.salary * 12 "Annual Salary"
FROM scott.employees AS e
WHERE e.salary > 1000
ORDER BY
e.first_name,
e.last_name;
Мета-информация:
Select statement:
Select set type: none
select clause:
Columns
Fullname:e.last_name
Prefix:e Column:last_name alias:name
Fullname:e.commission_pct
Prefix:e Column:commission_pct alias:comm
Fullname:e.salary * 12
Prefix: Column:e.salary * 12 alias:"Annual Salary"
from clause:
scott.employees as e
tableowner: scott
tablename: employees
tablealias: e
where clause:
e.salary > 1000
order by clause:
e.first_name,
e.last_name
Если это то, что вам нужно, то вы можете ознакомиться с этой статьей, которая иллюстрирует, как использовать анализатор sql для достижения этой цели.
Ответ №2:
Крутая кривая обучения ANTLR состоит в основном из изучения техники синтаксического анализа рекурсивного спуска. Синтаксис и особенности инструмента вносят свой вклад в сложность, но они вторичны. Другими словами, вам нужно было бы научиться выполнять синтаксические анализаторы, несмотря ни на что, но благодаря проверкам, встроенным в автоматический генератор синтаксических анализаторов, вы сводите к минимуму вероятность кодирования недопустимой грамматики.
Вы также могли бы выбрать готовый анализатор SQL (вот один для .NET и еще один для Java). Я попробовал их оба, и они отлично работают. Для загрузки компонентов может потребоваться членство в TopCoder. Оба этих компонента используют сгенерированные анализаторы, но они используют JavaCC и его порт C # вместо ANTLR. Тем не менее, грамматики достаточно близки, поэтому вы можете выбрать их в качестве отправной точки для вашего проекта.
Комментарии:
1. отличные решения, но, к сожалению, сайт, на котором они размещены (top coder), насколько я могу судить, не дает мне никакой информации о том, сколько будет стоить использование одного из этих решений для коммерческого использования.
2. @snowguy Я ничего не знаю об их ценах, потому что я никогда не использовал их компоненты для коммерческих проектов, но я не думаю, что они слишком высоки, потому что их стоимость очень низкая. Я уверен, что они были бы рады выслать вам информацию о ценах по электронной почте. Однако, если цена не соответствует вашим потребностям, вы всегда можете использовать проекты в качестве вдохновения для своей собственной работы: бесплатные загрузки включают полные исходные тексты.