我的问题是,我想按匹配对一个特定的搜索字符串排序。
这就是逻辑:
如果 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子句中,或在聚合函数中使用
1条答案
按热度按时间v6ylcynt1#
您正在混合字符串聚合(这是什么
string_agg()
和字符串连接(这是您想要的)。所以postgres把你的查询理解为一个聚合查询,坏事就会发生。你可以用||
连接字符串。另外,你应该修理你的车
where
所以它确实进行模式匹配(到目前为止,它正在寻找参数上的精确匹配)-ilike
便于避免lower()
在两个操作数上。最后,可以在
order by
子句来缩短查询。