首页 > 解决方案 > 根据表单数据的可用性调整 SELECT 语句

问题描述

我有一个books包含以下列的表格bid, isbn, title, author, year

在搜索页面中,为用户提供了 3 个可选输入:titleauthorisbn,并且应用程序在数据库中搜索具有类似标题title或类似作者author或 isbn 等于的书籍isbn。并且三个输入中的任何一个都可以为空。

这是我正在使用的 SQL 查询:

if form.validate_on_submit():
    title = form.title.data or 'NONE'
    author = form.author.data or 'NONE'
    isbn = form.isbn.data or ''
    books = db.execute('SELECT * FROM books WHERE title LIKE (:title) OR author LIKE (:author) or isbn=(:isbn)',
                        {
                            'title': f'%{title}%',
                            'author':f'%{author}%',
                            'isbn': isbn
                        }).fetchall()

这些or 'NONE'部分是避免使用 SQL 查询的一种解决方法,LIKE '%%'因为它将获取所有表行,而且我知道NONE我的 books 表中没有条目。

但是,这是一个肮脏的解决方法,我不喜欢它(也更慢?)。那么,在 LIKE 运算符中执行具有空变量的查询的干净方法是什么。

注意:我故意避免使用 ORM。

标签: pythonsqlflasksqlalchemywhere-clause

解决方案


'%%'您可以在模式匹配中明确避免,例如

SELECT * 
FROM books 
WHERE 
    (:title <> '%%' AND title LIKE :title)
    OR (:author <> '%%' AND author LIKE :author) 
    OR isbn = :isbn

推荐阅读