从 Oracle Select 中的字符串中检索前 X 个单词

Posted

技术标签:

【中文标题】从 Oracle Select 中的字符串中检索前 X 个单词【英文标题】:Retrieving first X words from a string in Oracle Select 【发布时间】:2015-08-17 16:46:18 【问题描述】:

我需要选择字符串中的前 X 个单词,其中 x 可以是 0-100 之间的任何数字。是否有捷径可寻?我发现以下示例从字符串中选择前 2 个单词:

select regexp_replace('Hello world this is a test', '(\w+ \w+).*$','\1') as first_two
from dual

如何从字符串中选择前 X 个单词,其中 X 可以是 0-100 之间的数字?

【问题讨论】:

你需要什么形式的结果?作为一个字符串?还是每个单词一列?还是一个字一行? 作为单个字符串。 Rene 下面的解决方案有效,只是我有一些字符串之间有两个空格,并且在这些字符串上失败了。这不是他的错,因为我没有提到。 @Robert Smith:我已经更新了我的答案,以便它可以在单词之间使用两个(或更多)空格。 【参考方案1】:

选择前四个单词:

select
   regexp_replace(
     'Hello world this is a test etc',
     '(((\w+)\s)4).*',  -- Change 4 to wanted number of words here!
     '\1'
   )
   from dual;

编辑

上述解决方案仅在单词由正好一个空格字符分隔时才有效。如果单词由一个或多个空格字符分隔,则\s 必须扩展为\s+

select
   regexp_replace(
     'Hello    world   this   is a   test     etc',
     '(((\w+)\s+)4).*',  -- Change 4 to wanted number of words here!
     '\1'
   )
   from dual;

【讨论】:

如果有两个空格,会有什么变化?我有一个字符串,例如“Hello world,这是一个测试等”,它有两个空格并且失败了。谢谢。 当然,你可以在\s之后添加一个量词,比如1,2 它现在可以工作了,上面的“编辑”适用于具有两个或更多空格的字符串。谢谢。【参考方案2】:

这个方法取你想要的单词个数提取出来的结果,然后把多个空格减为一个:

select trim(regexp_replace(regexp_substr('Hello         world this is a test etc', '(([^ ]*)( |$)*)3'), ' +', ' '))
from dual;

编辑:这越来越难看,但在它周围包裹了一个 TRIM() 以消除尾随空格(选择的最后一个单词之后的空格)。

【讨论】:

它正在工作,但唯一的小细节是它在字符串末尾留下了一个额外的空间。 好的,我在它周围添加了一个 TRIM() 调用以删除尾随空格并更新了我的帖子。附: Rene 的解决方案也需要这个。 顺便说一下,使用成比例的字体,将选中的字符串像这样用方括号括起来,以便于看到空格:select '[' ||我的字符串 || ']' 来自 ....【参考方案3】:

这样可以,但可能有点不雅,将“2”替换为要查找的单词数

select substr('this is a number of words',1,instr('this is a number of words',' ',1,2))
from dual

假设单词总是以空格结尾

【讨论】:

以上是关于从 Oracle Select 中的字符串中检索前 X 个单词的主要内容,如果未能解决你的问题,请参考以下文章

使用 to_char 函数解析为字符串时,如何从 Oracle 中的日期和月份值中删除前导零?

Oracle OCP 官方PPT学习日志 使用 SQL SELECT 语句检索数据 01

oracle--导入数据(从excel中粘贴数据)

Oracle SQL 从执行计划中检索具有表名的列名作为表

sql中limit使用方法

通过只知道没有时间的日期从表中选择 (ORACLE)