有条件地通过多列从DB获取行的函数

时间:2018-06-05 09:44:12

标签: javascript node.js postgresql express node-postgres

所以我可以说我GET/movies路线(实际上不是电影,但这样解释会更容易)

在客户端,我有一个表,我想根据下拉菜单过滤电影:

流派,年份,国家,类型(默认情况下,它们都在ALL

这些也是movies表的db上的列。我正在使用node-postgres

所以我的查询是这样的:

  const query = {
    text: 'SELECT * FROM movies WHERE genre = $1 AND year = $2 AND country = $3 AND type = $4',
    values: [genre, year, country, type],
  };

但如果用户不从下拉列表中选择任何内容(ALL

,则无效

最好的方法是什么,如果客户端发送ALL它只是不将该列添加到查询中?

1 个答案:

答案 0 :(得分:1)

我认为你别无选择,你应该只在适用时才提出你的条件......

例如:

const params = {
    genre: null,
    year: 2015,
    country: null,
    type: 'western',
};

const query = {
    text: 'SELECT * FROM movies',
    values: Object.values(params).filter(x => x),
};

if (Object.values(params).filter(x => x).length) {
    query.text += ' WHERE '
    let i = 1;
    for (const param of Object.keys(params).filter(x => params[x])) {
        query.text += `${param} = $${i} AND `
        i++;
    }
    query.text = query.text.substr(0, query.text.length - 5);
}

console.log(query); // {"text":"SELECT * FROM movies WHERE year = $1 AND type = $2","values":[2015,"western"]}

希望它有所帮助。