【问题标题】:Run LIKE query with optional parameters - SQLite3使用可选参数运行 LIKE 查询 - SQLite3
【发布时间】:2021-04-12 04:59:09
【问题描述】:

我正在创建一个使用 better-sqlite3 的电子应用程序,我想知道,一般来说,是否有一种方法可以运行使用带有可选参数的 LIKE 的查询?假设有一个包含 firstname 和 lastname 列的 people 表。用户可以通过以下方式搜索:

只有名字,在这种情况下查询将是:

SELECT * from people WHERE firstname LIKE %userEnteredFname%

只有姓氏,在这种情况下查询将是:

SELECT * from people WHERE lastname LIKE %userEnteredLname%

或两个字段:

SELECT * from people WHERE firstname LIKE %userEnteredFname% AND lastname LIKE %userEnterLname%

仅供参考,有一种方法可以使用可选参数INSERT

const stmt = db.prepare('INSERT INTO cats (name, age) VALUES (?, ?)');
const info = stmt.run('Joey'); //age would be null

查询取决于输入的搜索参数。果然你可以为少量的输入字段准备语句,但我有大约 7 个,那里可以有很多组合。

【问题讨论】:

  • (X LIKE '%' +?1+'%' OR ?1 IS NULL) AND (Y LIKE '%' +?2+'%' OR ?2 IS NULL) AND... So on... 然后把所有的参数或者空值放在没有输入的地方
  • @Selvin ?1 是什么?

标签: javascript node.js sqlite electron


【解决方案1】:

只要userEnterLname是空字符串,

 SELECT * from people WHERE firstname LIKE %userEnteredFname% AND lastname LIKE %userEnterLname%

相同
 SELECT * from people WHERE lastname LIKE %userEnteredLname%

因此,除非您想搜索它们,否则请将多余的变量保留为空。

【讨论】:

    【解决方案2】:

    当任何操作数为NULL时,运算符LIKE返回NULL
    所以对于所有列使用COALESCE(),如果传递的值为NULL,它将返回1(=TRUE):

    SELECT * 
    FROM people 
    WHERE COALESCE(firstname LIKE '%' || ? || '%', 1) 
      AND COALESCE(lastname LIKE '%' || ? || '%', 1)
    

    ? 占位符代表您将传递给查询的参数。

    【讨论】:

      猜你喜欢
      • 2021-06-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多