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时,你想列出什么?我的意思是,你想返回两行还是一行都不返回。这必须不产生任何行