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

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

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

dvtswwa3

dvtswwa31#

你可以用数字来列举单词 row_number() 在公共表表达式中(如果数据库支持这些功能),然后在外部查询中进行筛选:

  1. with cte as (
  2. select word, row_number() over(order by word) rn
  3. from mytable
  4. )
  5. select c.word
  6. from cte c
  7. where c.rn = (
  8. select c1.rn from cte c1 where c1.word = 'database'
  9. ) + 1

这会给你一个紧跟在“数据库”后面的词。你可以改变决赛 + 1 要获得其他结果(例如,要获得单词前面的两个位置,可以使用 - 2 ).
另一个选项使用行限制查询。
要获得下一个单词:

  1. select word
  2. from mytable
  3. where word > 'database'
  4. order by word
  5. limit 1

单词后面有两个位置:

  1. select word
  2. from mytable
  3. where word > 'database'
  4. order by word
  5. limit 1, 1

前面的单词:

  1. select word
  2. from mytable
  3. where word < 'database'
  4. order by word desc
  5. limit 1

单词前面有两个位置:

  1. select word
  2. from mytable
  3. where word < 'database'
  4. order by word desc
  5. limit 1, 1

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

展开查看全部
mklgxw1f

mklgxw1f2#

您可以使用如下窗口函数 LAG() (对于“数据库”之前的单词)和 LEAD() (对于“database”后面的单词):

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

改变 columnname 列的名称。
此查询返回“database”之前的单词,如果将1更改为2,则会得到“database”之前的单词2行。
根据您的数据库,您可以省略 order by (select null)over 条款。

c3frrgcw

c3frrgcw3#

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

  1. select word
  2. from dictionary
  3. where word > database
  4. order by word
  5. fetch first 1 row only;

后面的两个字:

  1. select word
  2. from dictionary
  3. where word > database
  4. order by word
  5. offset 1 fetch first 1 row only;

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

  1. select word
  2. from (select d.*,
  3. sum(case when word = 'database' then 1 else 0 end) over (order by word range between 2 preceding and 2 following) as cnt_database
  4. from dictionary d
  5. ) d
  6. where cnt_database > 0;

但是,在索引打开的情况下 (word) ,第一种方法会更快。

展开查看全部

相关问题