我正在尝试解析Java中的SELECT语句。我熟悉JOOQ,并希望使用它。我知道它不是明确设计为SQL解析器的,实际上还远远不止于此,所以我在想可能有一种使用其内部解析器解析SELECT查询的方法。
我看到了一些有关如何使用Visitor模式访问JOOQ内部构件的信息,但是我需要使用树状结构在查询内部进行导航,该结构允许分别访问查询的每个部分。我不想在所有用例中都使用“访客”模式。
这可能吗?我该怎么做呢?
答案 0 :(得分:2)
SQL Parsing API页给出了一个简单的示例:
ResultQuery<?> query =
DSL.using(configuration)
.parser()
.parseResultQuery("SELECT * FROM (VALUES (1, 'a'), (2, 'b')) t(a, b)");
parseResultQuery
是单个SELECT查询所需的方法,如果您可能有多个查询,请使用parse(String)
。
答案 1 :(得分:0)
从jOOQ 3.11开始,您确实可以使用<?php
function insert($values, $string) {
$string = str_replace(
[' ? ', '? ', ' ?'],
[' %s ', '%s ', ' %s'],
$string
);
return vsprintf($string, $values);
}
$string = "Hello ?. My name is ? I am ? years old. How are you?";
$values = ['you', 'Dan', '+- 30'];
// Prints: Hello you. My name is Dan I am +- 30 years old. How are you?
echo insert($values, $string), PHP_EOL;
// Prints: Nice nice!
echo insert(['nice'], 'Nice ?!'), PHP_EOL;
提取表达式树并进行一些内部调整(主要取决于通过反射的内部类型),但目前尚无法实现。将来,当可以通过公共API来访问表达式树(并且与SQL生成逻辑完全分离)时,将解决该问题,但现在还没有承诺。