sql查找搜索下面的结果1字段

0kjbasz6  于 2021-07-26  发布在  Java
关注(0)|答案(3)|浏览(275)

作为学习sql项目的一部分,我下载了一个.csv格式的字典,并设置了一个表(其中一列包含307104个单词,称为“单词”)。
我被一些问题困住了,它们是:
“数据库”后面是什么词
“数据库”后面的两个词是什么
“数据库”前面是什么词
“数据库”前面的两个词是什么
我找不到与此类型的查询相关的关键字,任何帮助都将不胜感激。

dvtswwa3

dvtswwa31#

你可以用数字来列举单词 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

这会给你一个紧跟在“数据库”后面的词。你可以改变决赛 + 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

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

mklgxw1f

mklgxw1f2#

您可以使用如下窗口函数 LAG() (对于“数据库”之前的单词)和 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 列的名称。
此查询返回“database”之前的单词,如果将1更改为2,则会得到“database”之前的单词2行。
根据您的数据库,您可以省略 order by (select null)over 条款。

c3frrgcw

c3frrgcw3#

如果要在数据库后面添加单词:

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”的查询是相似的,但排序和比较是相反的。
你可以开始喜欢使用窗口函数。例如,如果您需要从2 before到2 after的所有单词,可以使用windows计数:

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) ,第一种方法会更快。

相关问题