当某些参数未传入时,如何进行SQL查询筛选?
我已经为列表项构建了一个REST端点,当某些参数未传入时,如何进行SQL查询筛选?,sql,node.js,postgresql,go,sqlx,Sql,Node.js,Postgresql,Go,Sqlx,我已经为列表项构建了一个REST端点,/api/items,可以通过查询参数传递一些选项来过滤结果 例如,GET/api/items?minPrice=30&maxPrice=100&minRating=4&onSale=true 如何将其转换为SQL查询 如果我得到的请求只有maxPrice=50,那么其他参数呢?让我们假设下面是我的问题- select * from items where minPrice=(???) and maxPrice=50 and minRating=(???)
/api/items
,可以通过查询参数传递一些选项来过滤结果
例如,GET/api/items?minPrice=30&maxPrice=100&minRating=4&onSale=true
如何将其转换为SQL查询
如果我得到的请求只有maxPrice=50
,那么其他参数呢?让我们假设下面是我的问题-
select * from items
where minPrice=(???) and maxPrice=50 and minRating=(???) and onSale=(???)
如果没有请求任何筛选器,而只在maxPrice=50
上进行筛选,如何“忽略”该筛选器?有没有一种程序化的方法可以做到这一点
在我的例子中,我使用的是postgres,因此我用
&1
,&2
等参数化了查询,并为每一个参数设置了值。如果REST调用中没有提供值,您应该提供有意义的默认值。e、 g
minValue = 0
maxValue = <veryHighValue>
minRating = 0
onSale in (true, false)
minValue=0
最大值=
minRating=0
在线销售(对、错)
或者,您可以从这些默认值开始,然后使用REST调用提供的值进行覆盖。为此,您需要为任何类型的条件编写自定义查询 通常,ORM工具做得很好: 对于Java(Spring和JPA),您可以使用criteria api和一些帮助程序,其中之一是Spring Data的构建器规范模式:
Specifications fullSpec = null;
if (param1 != null) {
fullSpec = Specifications.where(<... criteria condition for param1 ...>);
}
if (param2 != null) {
if (fullSpec != null) {
specs = fullSpec.and(<define condition using criteria api>);
} else {
fullSpec = Specifications.where(<same condition for param2>);
}
}
我来自C#世界,在那里,您通常使用一个数据层,它允许您向SQL语句添加可选参数。它可能不会直接起作用,但可能会引发一种想法,即如何在您的世界中解决这个问题,并消除SQL注入的风险。您使用的是express js吗?我使用的是Go+sqlx,使用Knex在node+express中移植了一个写了一半的应用程序。您尝试过什么?您遇到了什么问题?解决了相同的问题:
var filterObject = {
minValue: <its value received from request>,
maxValue: <its value received from request>,
minRating: <its value received from request>,
maxRating: <its value received from request>
};
// filterout null valued properties out of filter
filterObject = _.compactObject(filterObject);
Items.findAll({
where: filterObject
});
var query = 'select * from items where maxPrice=:maxPrice'
if (minPrice) {
query = query + ' and minPrice=:minPrice'
}
//...
// fill-in all other conditions.
//...
// and then simply query with named parameters.