考虑用户输入关键字来搜索图书。首先,应用程序按书名匹配搜索,如果超过50本书与搜索匹配则返回结果;如果没有,它按书籍作者匹配搜索。如果一起匹配的书籍不超过50本,那么按书籍描述匹配则匹配。
SQL可以处理这种情况吗?或者我必须用ifs和elseifs编写存储过程?
[补充]我使用MySQL5.6。但我觉得答案在于ANSI-SQL,所以我没有指定它。非常感谢你的帮助!
答案 0 :(得分:3)
一种方法是使用单个查询进行所有比较,然后对结果进行优先级排序。 ANSI标准语法如下:
limit
当然,所有数据库都不支持最终子句,因此它可能是top
或{{1}}或更糟糕的事情。
如果你有一个大表,并且性能是一个问题,还有其他方法来表达查询,具体取决于匹配条件的样子。
答案 1 :(得分:1)
您可以使用带有子查询的union all
来实现它。
SELECT DISTINCT TOP(50) bookname
FROM (
SELECT TOP(50) bookname, 1 as rank
FROM yourTable
WHERE bookTitle = N'BLA'
UNION
SELECT TOP(50) bookname, 2 as rank
FROM yourTable
WHERE bookAuthor = N'BLA'
UNION
SELECT TOP(50) bookname, 3 as rank
FROM yourTable
WHERE bookDescription = N'BLA'
) as data
ORDER BY rank
这适用于SQL Server。在MySQL上,您需要使用LIMIT
而不是TOP
。
您应该指定在标签中使用的服务器。
编辑(由其他用户):
这是一个公认的答案,但它有一个问题,因为它可能会返回重复项。符合所有三个条件的书籍可以返回三次。 union
并没有消除它们,因为rank
在每一行都不同。
一种解决方案是删除排名并使用case
中的order by
语句:
order by (case when bookTitle = N'BLA' then 1
when bookAuthor = N'BLA' then 2
end)
作者编辑: 我使用已定义的列名称和一个distinct来更改上面的代码,这将保留重复的条目。