我想写一个SQL查询,由用户获取所有请求的列组合。例如对于表用户:(id,姓名,年龄,身高,体重)
应该可以通过参数[id, name],[id, name, age],[age,高度],...
为所有组合编写SQL查询当然效率太低。有没有一种使用PreparedStatement编写SQL查询的有效方法?
类似于此:
public User getByFiltered(User userDTO){
String sql = "SELECT * FROM user WHERE id=? AND age=? AND height=?";
PreparedStatement statement = dbConnectionManager.getConnection().prepareStatement(sql);
...
}
但基本上可以请求任何列的组合。
最好不使用任何过滤器从数据库中获取所有记录,然后在Java级别应用逻辑
你可以这样做:
SELECT * FROM user
WHERE
(0 = ? OR id = ?)
AND
(0 = ? OR age = ?)
AND
(0 = ? OR height = ?)
当你想搜索比如年龄=21和身高=175(我更喜欢cm)而你不关心id时,你可以传递以下参数:
(0 = 0 OR id = 0)
AND
(0 = 1 OR age = 21)
AND
(0 = 1 OR height = 175)
表示0=
将为
0
;如果相关,则代码>将为1
(而且id
的参数可以是任何东西)
现在因为(0=0或id=0)
的计算结果总是为TRUE(因为0=0
是TRUE
),所以它不做任何过滤
但是因为0=1
是FALSE
其他条件:age=21
和height=175
必须是TRUE
这样你就有了3个参数:
前3个参数指示一个列是:
相关的(所以你传递1
)
还是不相关的(所以你传递0
)
其他3个是进行过滤的实际参数(或任何与该列无关的参数)。
这就是你想要的吗?
SELECT u.*
FROM user u
WHERE (id = ? OR ? IS NULL) AND
(age = ? OR ? IS NULL) AND
(height = ? OR ? IS NULL);
请注意,这需要将参数加倍。
命名参数简化了这一点:
SELECT u.*
FROM user u
WHERE (id = :id OR :id IS NULL) AND
(age = :age OR :age IS NULL) AND
(height = :height OR :height IS NULL);
问题内容: 我有一个带有许多字段的表。我正在尝试在asp.net中创建搜索过滤器,以便用户可以按一个或多个字段进行搜索。所以基本上我想创建一个包含4个参数的存储过程,如果它不为null,它将把参数附加到WHERE子句中。 TableExample有4列,Col1 Col2 Col3 Col4 我希望有一种方法可以用一个存储过程完成此操作,而不必为每种可能的组合创建一个。 我正在尝试类似的方法,虽然
问题内容: “过滤后的查询和过滤器”与“根查询和过滤器”之间有什么区别吗?例如 情况1: 情况2: 我在http://elasticsearch-users.115913.n3.nabble.com/Filtered-query-vs-using- filter-outside-td3960119.html中 找到了此讨论,但所引用的URL是404,并且解释过于简洁我。 请示教或提供指出这些区别的
问题内容: 对于 内部联接 ,在子句或子句中应用过滤器的性能有何不同?哪个会更有效,或者优化器将使它们相等? 加入 VS 在哪里 Oracle11gR2 问题答案: 应该没有区别。在这两种情况下,优化器都应生成相同的计划,并且应该能够基于特定查询的最有效方法,在这两种情况下的连接之前,之后或之中应用谓词。 当然,事实优化 可以 做一些事情,一般来说,是不能保证优化器 会 做一些实际的特定查询。随着
问题内容: 我的问题很简单。我想在Elastica的一个查询中组合两个过滤器,一个filter_bool和一个filter_range。该代码是 我不能在$ elasticaQuery中将两个过滤器放在一起。请给我任何帮助! 谢谢! 问题答案: 为什么不将范围过滤器添加为过滤器中的另一个术语: 您需要在布尔过滤器中使用过滤器,而不是查询。注意我已经使用而不是您正在使用的范围查询。 另外,您知道您使
问题内容: 我想知道每个团队中有10%以上的用户百分比。当前,这需要两个查询: 我可以合而为一吗,所以得到这样的结果: 问题答案: 您可以使用来检查特定行的数量是否大于10,并相应地进行计数(使用)。 在MySQL中,我们可以进一步缩短它,因为函数可以简单地将条件运算符/函数的结果强制转换为0/1(分别为false / true):
问题内容: 我什么时候应该使用查询或过滤器或两者的某种组合都看不到任何描述。它们之间有什么区别?谁能解释一下? 问题答案: 区别很简单:过滤器被缓存并且不影响得分,因此比查询要快。也在这里看看。假设查询通常是用户输入的内容,并且几乎是不可预测的,而过滤器则可以帮助用户缩小搜索结果的范围,例如使用构面。