SQL 在搜索下方找到结果 1 字段

SQL Find a result 1 field below the search

作为学习项目的一部分 SQL 我已经将词典下载为 .csv 并设置了 table(1 列包含 307,104 个单词,称为 'Words' ).

我遇到了一些问题,它们是:

我找不到与此类查询相关的关键字,如有任何帮助,我们将不胜感激。

你可以在普通的table表达式中枚举带有row_number()的词(如果你的数据库支持这些特性),然后在外部查询中过滤:

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

这会为您提供紧跟在 "database" 之后的单词。您可以更改最后的 + 1 以获得其他结果(例如,要获取前面两个位置的单词,您可以使用 - 2)。

另一个选项使用行限制查询。

获取下一个单词:

select word
from mytable
where word > 'database'
order by word
limit 1

后面两个位置的单词:

select word
from mytable
where word > 'database'
order by word
limit 1, 1

前一个词:

select word
from mytable
where word < 'database'
order by word desc
limit 1

前面两个位置的单词:

select word
from mytable
where word < 'database'
order by word desc
limit 1, 1

注意:行限制子句的语法因数据库而异。

您可以使用 window 函数,例如 LAG()(对于 'Database' 之前的单词)和 LEAD()(对于 'Database' 之后的单词):

select t.result 
from (
  select columnname, lag(columnname, 1) over (order by (select null)) result
  from words
) t
where t.columnname = 'Database'

columnname 更改为您的专栏名称。
此查询 returns 'Database' 之前的单词,如果将 1 更改为 2,您将在 'Database'.
之前获得第 2 行的单词 根据您的数据库,您可以从 over 子句中省略 order by (select null)

如果你想要数据库后面的词:

select word
from dictionary
where word > database
order by word
fetch first 1 row only;

后面两个词:

select word
from dictionary
where word > database
order by word
offset 1 fetch first 1 row only;

"before"的查询类似,但排序和比较方向相反。

您可以开始使用 window 函数。例如,如果你想要从 2 before 到 2 after 的所有单词,你可以使用 windows count:

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;

但是,使用 (word) 上的索引,第一种方法会更快。