SQL 在搜索下方找到结果 1 字段
SQL Find a result 1 field below the search
作为学习项目的一部分 SQL 我已经将词典下载为 .csv 并设置了 table(1 列包含 307,104 个单词,称为 'Words' ).
我遇到了一些问题,它们是:
- 'Database'
后面是什么词
- 'Database'
后2个字是什么字
- 前面是什么词'Database'
- 什么词在 'Database'
前 2 个词
我找不到与此类查询相关的关键字,如有任何帮助,我们将不胜感激。
你可以在普通的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)
上的索引,第一种方法会更快。
作为学习项目的一部分 SQL 我已经将词典下载为 .csv 并设置了 table(1 列包含 307,104 个单词,称为 'Words' ).
我遇到了一些问题,它们是:
- 'Database' 后面是什么词
- 'Database' 后2个字是什么字
- 前面是什么词'Database'
- 什么词在 'Database' 前 2 个词
我找不到与此类查询相关的关键字,如有任何帮助,我们将不胜感激。
你可以在普通的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)
上的索引,第一种方法会更快。