Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
当某些参数未传入时,如何进行SQL查询筛选?_Sql_Node.js_Postgresql_Go_Sqlx - Fatal编程技术网

当某些参数未传入时,如何进行SQL查询筛选?

当某些参数未传入时,如何进行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=(???)

我已经为列表项构建了一个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=(???) 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.