with cte as (
select word, row_number() over(order by word) rn
from mytable
)
select c.word
from cte c
where c.rn = (
select c1.rn from cte c1 where c1.word = 'database'
) + 1
select word
from (select d.*,
sum(case when word = 'database' then 1 else 0 end) over (order by word range between 2 preceding and 2 following) as cnt_database
from dictionary d
) d
where cnt_database > 0;
3条答案
按热度按时间dvtswwa31#
你可以用数字来列举单词
row_number()
在公共表表达式中(如果数据库支持这些功能),然后在外部查询中进行筛选:这会给你一个紧跟在“数据库”后面的词。你可以改变决赛
+ 1
要获得其他结果(例如,要获得单词前面的两个位置,可以使用- 2
).另一个选项使用行限制查询。
要获得下一个单词:
单词后面有两个位置:
前面的单词:
单词前面有两个位置:
注意:行限制子句的语法因数据库而异。
mklgxw1f2#
您可以使用如下窗口函数
LAG()
(对于“数据库”之前的单词)和LEAD()
(对于“database”后面的单词):改变
columnname
列的名称。此查询返回“database”之前的单词,如果将1更改为2,则会得到“database”之前的单词2行。
根据您的数据库,您可以省略
order by (select null)
从over
条款。c3frrgcw3#
如果要在数据库后面添加单词:
后面的两个字:
对“before”的查询是相似的,但排序和比较是相反的。
你可以开始喜欢使用窗口函数。例如,如果您需要从2 before到2 after的所有单词,可以使用windows计数:
但是,在索引打开的情况下
(word)
,第一种方法会更快。