Java动态生成SQL查询-ATHENA
我正在尝试根据用户输入生成sql查询。UI上有4个搜索字段: 名、姓、科目、分数 根据用户输入,我计划生成SQL查询。输入可以是任何组合 例如:Java动态生成SQL查询-ATHENA,java,sql,Java,Sql,我正在尝试根据用户输入生成sql查询。UI上有4个搜索字段: 名、姓、科目、分数 根据用户输入,我计划生成SQL查询。输入可以是任何组合 例如:从表中选择*,其中FIRST\u NAME=“some\u value” 当给出FIRST_NAME且其他字段为空时,需要生成此查询 从FIRST_NAME=“some_value”和LAST_NAME=“some_value”所在的表中选择* 当给出FIRST_NAME和LAST_NAME且其他字段为空时,需要生成此查询 由于有4个输入字段,因此可以生
从表中选择*,其中FIRST\u NAME=“some\u value”代码>
当给出FIRST_NAME且其他字段为空时,需要生成此查询
从FIRST_NAME=“some_value”和LAST_NAME=“some_value”所在的表中选择*代码>
当给出FIRST_NAME和LAST_NAME且其他字段为空时,需要生成此查询
由于有4个输入字段,因此可以生成的可能查询数为24(4的阶乘)
一个想法是为所有24种情况编写if条件
Java伪代码:
String QUERY = "select * from TABLE where ";
if (FIRST_NAME!=null) {
QUERY = QUERY + "FIRST_NAME='use_input_value';"
}
if (LAST_NAME!=null) {
QUERY = QUERY + "LAST_NAME='use_input_value';"
}
if (SUBJECT!=null) {
QUERY = QUERY + "SUBJECT='use_input_value';"
}
if (MARKS!=null) {
QUERY = QUERY + "MARKS='use_input_value';"
}
我不知道如何为多个输入值生成带有和编码条件的SQL查询。
我已经了解了有关动态生成sql查询的概念,但无法进一步处理
有人能帮我吗
仅供参考:我已经完成了,仍然无法根据用户输入生成查询字符串。让我们考虑一下,如果您只运行您编写的代码,并且同时提供了名字和姓氏
,将会发生什么。您将得到以下结果:
select * from TABLE where FIRST_NAME='use_input_value';LAST_NAME='use_input_value';
这里有两个问题:
该查询在语法上不正确
它包含文本“使用\u输入\u值”
,而不是您想要的值
要解决第一个问题,让我们首先在每个表达式的开头添加和,并删除分号,如下所示:
String QUERY = "select * from TABLE where";
if (FIRST_NAME!=null) {
QUERY = QUERY + " and FIRST_NAME='use_input_value'";
}
select * from TABLE where and FIRST_NAME='use_input_value' and LAST_NAME='use_input_value'
注意和
前面的空格。我们还可以删除where
后面的空格
现在,同时具有FIRST_NAME和LAST_NAME的查询将如下所示:
String QUERY = "select * from TABLE where";
if (FIRST_NAME!=null) {
QUERY = QUERY + " and FIRST_NAME='use_input_value'";
}
select * from TABLE where and FIRST_NAME='use_input_value' and LAST_NAME='use_input_value'
更好,但现在有一个额外的和。我们可以通过在查询开始处添加一个虚拟的always true条件来解决这个问题:
String QUERY = "select * from TABLE where 1=1";
然后,在计算完所有条件后,我们添加了一个分号,我们得到了一个有效的查询:
select * from TABLE where 1=1 and FIRST_NAME='use_input_value' and LAST_NAME='use_input_value';
(可能不需要附加分号。大多数数据库不需要在这样一个查询的末尾加分号。)
关于字符串文本。您应该添加一个占位符,同时将要使用的值添加到列表中
String QUERY = "select * from TABLE where";
List<String> args = new ArrayList<>();
if (FIRST_NAME!=null) {
QUERY = QUERY + " and FIRST_NAME=?";
args.add(FIRST_NAME);
}
由于某些原因,列和参数在JDBCAPI中从1开始索引,因此我们必须将1添加到i
以生成参数索引
然后执行PreparedStatement
,感谢您的详细解释。是否有一种方法可以构建字符串而不是使用PreparedStatement?同样在字符串文字部分string QUERY=“select*from TABLE where”;使用。你能解释一下为什么不在这里使用吗。因为我是ATHENA(AWS服务,基于PRESTO)来查询,所以我不能使用准备好的语句。我认为我应该选择选项1(1=1条件)。如果有更好的方法,请向我推荐。再次感谢您在此场景(不支持prepareStatement)中的详细解释,我认为我应该使用字符串格式来生成sql查询如果FIRST_NAME
等是用户输入,则由于以下原因,您不希望将其直接附加到字符串中。这就是为什么您通常使用带有占位符的PreparedStatement
,以允许JDBC为您正确地转义或清理输入。