python sqlite3部分搜索

python sqlite3部分搜索,python,sql,python-3.x,sqlite,search,Python,Sql,Python 3.x,Sqlite,Search,我想用pythonsqlite3进行部分搜索。我的初步查询是: cur.execute("SELECT * FROM book WHERE title=? OR author=? OR year=? OR isbn=?", (title, author, year, isbn)) 然后我尝试使用LIKE关键字和字符串格式来获取标题的部分搜索结果,如下所示: cur.execute("SELECT * FROM book WHERE title LIKE ? OR

我想用
python
sqlite3
进行部分搜索。我的初步查询是:

cur.execute("SELECT * FROM book WHERE title=? OR author=? OR year=? OR isbn=?", (title, author, year, isbn))
然后我尝试使用
LIKE
关键字和字符串格式来获取
标题的部分搜索结果,如下所示:

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

这似乎对
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年,我会得到所有结果:

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

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))

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

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))

您可以创建一个参数列表,为
标题
作者
年份
isbn
的文本框附加非空值(修剪完整的空白值),使用
而不是
运算符将这些参数的对应项添加到Select语句中,例如

query = "SELECT * FROM book WHERE 1=1 "

prm=[]

if len(title.strip())>0:
    prm.append('%{}%'.format(title))
    query+=" AND title LIKE ?"

if len(author.strip())>0:
    prm.append(author)
    query+=" AND author=?"

if len(year.strip())>0:
    prm.append(year)
    query+=" AND year=?"

if len(isbn.strip())>0:
    prm.append(isbn)
    query+=" AND isbn=?"
    
cur.execute(query, (prm))

您可以创建一个参数列表,为
标题
作者
年份
isbn
的文本框附加非空值(修剪完整的空白值),使用
而不是
运算符将这些参数的对应项添加到Select语句中,例如

query = "SELECT * FROM book WHERE 1=1 "

prm=[]

if len(title.strip())>0:
    prm.append('%{}%'.format(title))
    query+=" AND title LIKE ?"

if len(author.strip())>0:
    prm.append(author)
    query+=" AND author=?"

if len(year.strip())>0:
    prm.append(year)
    query+=" AND year=?"

if len(isbn.strip())>0:
    prm.append(isbn)
    query+=" AND isbn=?"
    
cur.execute(query, (prm))


我得到的结果与我的原始代码相同,即部分搜索标题作品,但(完整)搜索其他代码不再有效。@梅尔你能在我的代码不起作用的地方发布示例数据吗?我已经添加了新代码和一些screenshots@MeL您忘了提到可以用空字符串搜索某些参数。在我的代码中,有8个参数传入
cur.execute
。每列2个。您是否按原样使用代码?我得到的结果与原始代码相同,即部分搜索标题作品,但(完整)搜索其他代码不再有效。@梅尔你能在我的代码不起作用的地方发布示例数据吗?我已经添加了新代码和一些screenshots@MeL您忘了提到可以用空字符串搜索某些参数。在我的代码中,有8个参数传入
cur.execute
。每列2个。您是否按原样使用了代码?如果表单中有两个或多个文本框不为空,则
将不起作用。例如,如果Author='xyz'和Year=1970,则结果应为1970年'xyz'的书籍。默认情况下,类似SQLite的运算符对ASCII字符不区分大小写。当表单中有两个或多个文本框不为空时,
将不起作用。例如,如果Author='xyz'和Year=1970,结果应该是1970年'xyz'的书籍。默认情况下,类似SQLite的运算符对ASCII字符不区分大小写。当第一个文本值为amst,第二个文本值同时为1970时,您希望列出什么?我的意思是,你想返回两行还是不返回。这必须不产生行。当第一个文本值是amst,第二个文本值同时是1970时,你想列出什么?我的意思是,你想返回两行还是一行都不返回。这必须不产生任何行