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

古斯塔沃·席尔瓦(Gustavo Silva)

我的问题是我想按特定的搜索字符串进行匹配排序。

这是逻辑:

如果title, authorisbn与相同search,请先显示这些书

如果title, authorisbn相似%search,请再显示这些书

如果title, authorisbn相似search%则将这些书显示在第三位

我正在使用SQLAlchemyFlaskPostgreSQL

这是代码:

#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”列必须出现在GROUP BY子句中或在聚合函数中使用

专线小巴

您正在混合字符串聚合(这是做什么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

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

两列上的多个条件,按顺序排列

来自分类Dev

两列上的多个条件,按顺序排列

来自分类Dev

Excel:多个匹配条件(带有IF抛出)

来自分类Dev

mysql按多个条件排序

来自分类Dev

多个查询时按字母顺序排序?

来自分类Dev

按字母顺序对多个列表进行排序

来自分类Dev

按LIKE的顺序查询多个类似条件

来自分类Dev

在JavaScript中按多个键和多个顺序排序

来自分类Dev

按多个条件对项目进行排序

来自分类Dev

按多个条件对列表进行排序并附加

来自分类Dev

Python:按多个条件显示排序的字典

来自分类Dev

熊猫python COUNTIF在具有多个条件的多个列上

来自分类Dev

在多个列上具有多个条件的Select语句

来自分类Dev

mysql按特定顺序按多个值排序

来自分类Dev

R:按条件在多个列上应用函数(如聚合)

来自分类Dev

是否可以按当前排序的顺序获取跨多个页面的所有jqGrid行?

来自分类Dev

SQL查询按日期降序并带有多个“ like”子句以非常特定的顺序获取结果

来自分类Dev

如何按文件顺序从多个文件中获取带有字符串的行?

来自分类Dev

带有多个条件的Elasticsearch OR条件

来自分类Dev

合并多个输入字符串以按字母顺序排序

来自分类Dev

在多个列上使用ifelse条件

来自分类Dev

在多个列上使用ifelse条件

来自分类Dev

在单列上具有多个条件的Access 2007更新查询

来自分类Dev

多个具有条件的列上的COUNT()

来自分类Dev

按多个规则排序

来自分类Dev

有效匹配多个条件的列

来自分类Dev

具有多个条件的VBA匹配功能

来自分类Dev

创建具有多个匹配条件的列表

来自分类Dev

按一列对多个定界文件按字典顺序排序,对另一列按数字顺序排序

Related 相关文章

热门标签

归档