【问题标题】:How to create an sql statement with optional parameters如何创建带有可选参数的 sql 语句
【发布时间】:2019-11-07 22:10:58
【问题描述】:

我有一个 lessons 表,其中包含以下字段:

id  title   type    language    level 

用户可以通过界面选择自己想开的女巫课程。

他会开始选择语言,然后是类型,最后是关卡。

在此过程中,我想使用单个 sql 语句查询数据库,但当然第一个查询将只有语言字段。我想出了这个语法,但它不起作用:

function queryLessonList (language, type, level){

    const values = [language, type, level];

    const sql = "SELECT * FROM lessons WHERE (language=?) AND (? is null OR type=?) AND (? is null OR level=?)";

    return query(sql, values);
}

我怎样才能让它工作?

【问题讨论】:

  • 你在正确的轨道上。您可以在您使用的框架中使用命名参数对查询进行参数化吗?如果不是,那么type=coalesce(?,type) 之类的内容将允许您只输入一次问号。
  • 也许让你的值数组等于 [language, type, type, level, level] 以便你使用相同数量的参数来检查
  • Brody,谢谢,解决了这个问题。没想到参数号不匹配!

标签: mysql sql node.js reactjs


【解决方案1】:

为了降低检查变量和构建查询的复杂性,您可以向函数传递一个要匹配的对象、您想要的内容以及您想要返回的列等(因为* 并不理想)。

类似:

function queryLessonList (where = {}, columns = ['*']) {
  let keys = Object.keys(where)
  let values = Object.values(where)
  columns = !columns.length || columns[0] === '*' ?
    '*': columns.map(e => '`'+e+'`').join(',')

  let sql = `
    SELECT ${columns}
    FROM lessons
    ${keys.length ? 'WHERE \`'+keys.join('` = ? AND `')+'\` = ?' : ''}
  `

  return query(sql, values)
}

/*
   SELECT *
   FROM lessons
   WHERE `language` = ? AND `type` = ?
 */
queryLessonList({
  language: 'en',
  type: 'foo'
}, [])


/*
  SELECT `id`
  FROM lessons
*/
queryLessonList({}, ['id'])


/*
  SELECT *
  FROM lessons
*/
queryLessonList()

【讨论】:

    猜你喜欢
    • 2014-09-26
    • 1970-01-01
    • 1970-01-01
    • 2012-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多