我正在开发一种将 Oracle SQL 转换为 ANSI SQL 的工具。我有一个可以解析 Oracle SQL 和 ANSI SQL 的语法。
我想从 AST 的 where 子句部分中提取 Oracle 外连接表达式,并在 AST 的 from 子句部分的末尾插入新的连接子句以匹配选择或子查询。
具有重写规则的树解析器可以进行这种类型的树转换吗?
即采用从 Oracle SQL 生成的 AST
SELECT
a.columna, b.columnb
FROM
tablea a,
tableb b
WHERE
a.columna2 (+) = b.columnb2 (+)
AND
a.columna3 = 'foo'
AND
b.columnb3 = 'bar'
并将其转换为 AST 用于 ANSI SQL
SELECT
a.columna, b.columnb
FROM
tablea a FULL OUTER JOIN tableb b ON (a.columna2 = b.columnb2 )
WHERE
a.columna3 = 'foo'
and
b.columnb3 = 'bar'
注意 1:从子句中删除表引用tablea
并替换为引用相同表和表别名的子句。tableb
FROM
JOIN
注意 2:Oracle 连接条件FULL OUTER JOIN
通过 sql_condition 比较两侧的 OuterJoinIndicator (+) 标识为 a。
注意 3:连接条件比较从WHERE
子句中删除,并用于构造连接子句 ON 条件 [删除了 OuterJoinIndicator(s)]。