我在一个sql语句(如果存在的话)之后或者如何设置一个方法使用几个sql语句来实现下面的。
我有一个列表框和一个搜索文本框。
在搜索框中,用户将输入姓氏,例如史密斯。 然后我想用这样的东西查询数据库以进行搜索:
select * FROM customer where surname LIKE searchparam
这将为我提供姓氏包含:SMITH 的客户的所有结果。很简单,对吧?
我需要做的是限制返回的结果。如果搜索参数只是 S,这个语句可以给我 1000 行。 我想要的是结果,仅限于前 20 个匹配项和第一个匹配项之前的 10 行。
例如SMI搜索:
Sives
Skimmings
Skinner
Skipper
Slater
Sloan
Slow
Small
Smallwood
Smetain
Smith ----------- This is the first match of my query. But i want the previous 10 and following 20.
Smith
Smith
Smith
Smith
Smoday
Smyth
Snedden
Snell
Snow
Sohn
Solis
Solomon
Solway
Sommer
Sommers
Soper
Sorace
Spears
Spedding
有没有办法做到这一点? 尽可能少的sql语句。
原因?我正在为互联网连接速度较慢的用户创建一个应用。
我正在使用 POSTGRESQL v9
谢谢 安德鲁
最佳答案
WITH ranked AS (
SELECT *, ROW_NUMBER() over (ORDER BY surname) AS rowNumber FROM customer
)
SELECT ranked.*
FROM ranked, (SELECT MIN(rowNumber) target FROM ranked WHERE surname LIKE searchparam) found
WHERE ranked.rowNumber BETWEEN found.target - 10 AND found.target + 20
ORDER BY ranked.rowNumber
SQL fiddle here .请注意, fiddle 使用示例数据,我将范围修改为之前的 3 个条目和过去的 6 个条目。
关于用于选择搜索参数的前几行的sql语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21407689/