我应该使用ANTLR来转换简单的SQL select语句吗?

时间:2011-11-11 18:46:49

标签: sql antlr

我需要编写一个接受基本SQL select语句的程序,并输出一个XML文件,该语句将语句分解为它的组成部分(输出列,输入表,连接,分组依据,聚合等) 。至少我需要在from语句中支持2个表,不同的连接类型,where子句,group by和having。如果可以支持更复杂的sql(例如子查询),这是一个奖励,但不是必需的。

我检查了ANTLR,它看起来像一条陡峭的学习曲线。鉴于我有能力要求SQL相当简单,我应该尝试手工编写代码还是应该开始使用ANTLR?

2 个答案:

答案 0 :(得分:3)

我认为你不需要用ANTLR重新发明这样的sql解析器。以下是将选择SQL语句解码为元数据的示例:

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

如果这是您所需要的,那么您可以查看说明如何使用this article来实现此目的的sql parser

答案 1 :(得分:1)

ANTLR的陡峭学习曲线主要包括学习递归下降解析技术。该工具的语法和特性有助于提高复杂性,但它们是次要的。换句话说,无论如何,您都需要学习如何进行解析器,但是使用自动解析器生成器中内置的检查可以最大限度地减少编码无效语法的机会。

您还可以选择预先构建的SQL解析器(here is one for .NETanother one for Java)。我试过他们两个,他们工作正常。您可能需要使用TopCoder会员资格来下载组件。这两个组件都使用生成的解析器,但它们使用JavaCC及其C#端口而不是ANTLR。但是,语法相当接近,因此您可以选择它们作为项目的起点。