在多个列上按匹配排序(并且具有多个条件)

k2fxgqgv  于 2021-07-26  发布在  Java
关注(0)|答案(1)|浏览(250)

我的问题是,我想按匹配对一个特定的搜索字符串排序。
这就是逻辑:
如果 title, author 或者 isbn 与…相同 search ,先把这些书拿出来
如果 title, author 或者 isbn 是这样的吗 %search ,把这些书拿给我看
如果 title, author 或者 isbn 是这样的吗 search% ,把这些书拿给我看
我正在使用sqlalchemy,flask和postgresql
代码如下:


# keep an unformatted version of search, to be able to order

    unformattedSearch = search
    search = "%" + search + "%"

    result = db.execute("SELECT title, author, isbn FROM books WHERE \
        LOWER(title) LIKE LOWER(:search) OR \
        LOWER(isbn) LIKE LOWER(:search) OR \
        LOWER(author) LIKE LOWER(:search) \
        ORDER BY \
        CASE \
            WHEN title = :search THEN 0 \
            WHEN author = :search THEN 1 \
            WHEN isbn = :search THEN 2 \
            \
            WHEN title LIKE string_agg(:unformattedSearch,'%') THEN 3\
            WHEN author LIKE string_agg(:unformattedSearch,'%') THEN 4 \
            WHEN isbn LIKE string_agg(:unformattedSearch,'%') THEN 5 \
            \
            WHEN title LIKE string_agg('%',:unformattedSearch) THEN 6 \
            WHEN author LIKE string_agg('%',:unformattedSearch) THEN 7 \
            WHEN isbn  LIKE string_agg('%',:unformattedSearch) THEN 8 \
        ELSE 9 \
        END",
        {"search": search, "unformattedSearch": unformattedSearch}).fetchall()

这就是我得到的错误:
“books.title”列必须出现在GROUPBY子句中,或在聚合函数中使用

v6ylcynt

v6ylcynt1#

您正在混合字符串聚合(这是什么 string_agg() 和字符串连接(这是您想要的)。所以postgres把你的查询理解为一个聚合查询,坏事就会发生。你可以用 || 连接字符串。
另外,你应该修理你的车 where 所以它确实进行模式匹配(到目前为止,它正在寻找参数上的精确匹配)- ilike 便于避免 lower() 在两个操作数上。
最后,可以在 order by 子句来缩短查询。

select title, author, isbn 
from books 
where  
       title  ilike '%' || :search || '%' 
    or isbn   ilike '%' || :search || '%' 
    or author ilike '%' || :search || '%' 
order by 
    (title  = :search) desc,
    (author = :search) desc,
    (isbn   = :search) desc,
    (title  ilike :search || '%') desc,
    (author ilike :search || '%') desc,
    (isbn   ilike :search || '%') desc,
    (title  ilike '%' || :search) desc,
    (author ilike '%' || :search) desc,
    (isbn   ilike '%' || :search) desc

相关问题