如何为大查询制作类似 java 准备语句的查询或如何在大查询中转义参数
Posted
技术标签:
【中文标题】如何为大查询制作类似 java 准备语句的查询或如何在大查询中转义参数【英文标题】:How to make java prepared-statement like query for big-query or how to escape parameters in big-query 【发布时间】:2015-02-02 09:57:02 【问题描述】:我在我的项目中使用大查询,并根据一些用户输入准备一个查询,这些输入作为查询中的参数。
我们怎样才能以最好的方式做到这一点?
对于java jdbc,我们有,所以我们使用prepared-statement。
他们是不是类似于 prepared-statement 用于 big-query。
或者您能否提供最好的方法来转义此用户输入,以便将其添加到 big-query 的 sql 查询中。
【问题讨论】:
为什么首先需要转义用户输入?听起来您将 BigQuery 用作传统的 RDBMS。您可以查看this 以了解如何转义用户输入。 在进行 sql 查询时,我们需要一些用户输入来根据他们想要的最佳结果过滤结果。所以我希望输入不会产生任何问题。就为了这个 现在我正在使用 StringEscapeUtils.escapejavascript。它与 googleBigquery 具有相同的规则 【参考方案1】:BigQuery 现在支持参数化查询。您可以使用@param_name
之类的标识符和?
的位置参数。
文档中的 Java 示例:
String query =
"SELECT word, word_count\n"
+ "FROM `bigquery-public-data.samples.shakespeare`\n"
+ "WHERE corpus = @corpus\n"
+ "AND word_count >= @min_word_count\n"
+ "ORDER BY word_count DESC";
// Note: Standard SQL is required to use query parameters.
QueryJobConfiguration queryConfig =
QueryJobConfiguration.newBuilder(query)
.addNamedParameter("corpus", QueryParameterValue.string(corpus))
.addNamedParameter("min_word_count", QueryParameterValue.int64(minWordCount))
.build();
https://cloud.google.com/bigquery/docs/parameterized-queries
【讨论】:
【参考方案2】:BigQuery 不支持预准备语句(或任何类似的语句),因此最有效的解决方案可能是将查询字符串分解为片段并将它们与用户提供的值连接在一起。连接字符串的最快方法似乎只是使用“+”运算符,通过这些旧帖子:
What's the fastest way to concatenate two Strings in Java? String concatenation: concat() vs "+" operator Yet again on string append vs concat vs +【讨论】:
BigQuery 现在支持参数化查询 - 请查看我的回复。以上是关于如何为大查询制作类似 java 准备语句的查询或如何在大查询中转义参数的主要内容,如果未能解决你的问题,请参考以下文章