首页 > 解决方案 > python sqlite3 部分搜索

问题描述

我想用python sqlite3. 我最初的查询是:

cur.execute("SELECT * FROM book WHERE title=? OR author=? OR year=? OR isbn=?", (title, author, year, isbn))

然后我尝试使用LIKE关键字和字符串格式来获取 的部分搜索结果title,如下所示:

cur.execute("SELECT * FROM book WHERE title LIKE ? OR author=? OR year=? OR isbn=?", ('%{}%'.format(title), author, year, isbn))

https://stackoverflow.com/a/20904256/13290801

这似乎可以解决问题title,但是现在在搜索其他参数时,尽管终端没有错误,但它根本不起作用。我错过了什么?

编辑 我尝试了@forpas 发布的答案,但它给了我相同的结果。

所以我的搜索功能的新代码是:

def search(title="", author="", year="", isbn=""):
    conn = sqlite3.connect('books.db')
    cur = conn.cursor()
    cur.execute("SELECT * FROM book WHERE title LIKE '%' || ? || '%' OR author=? OR year=? OR isbn=?", (title, author, year, isbn))

它适用于标题。如果我搜索“amst”,我会得到阿姆斯特丹标题: 标题部分搜索作品

但是,如果我按年份搜索 1970,我会得到所有结果: 年份搜索不起作用

标签: pythonsqlpython-3.xsqlitesearch

解决方案


如果要对标题进行部分搜索,则必须在搜索标题'%'的开头和结尾处连接通配符。
此外,您还需要一个附加条件,即为列传递空字符串和运算符AND而不是OR

sql = """
SELECT * FROM book 
WHERE (title LIKE '%' || ? || '%' OR LENGTH(?) = 0)
  AND (author = ? OR LENGTH(?) = 0) 
  AND (year = ? OR LENGTH(?) = 0) 
  AND (isbn = ? OR LENGTH(?) = 0)
"""
cur.execute(sql, (title, title, author, author, year, year, isbn, isbn))

推荐阅读