从 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 中的日期和月份值中删除前导零?