在SQL Developer中查找字符串中的第一个和第二个单词

时间:2014-08-04 04:31:20

标签: sql database string oracle-sqldeveloper

如何在SQL Developer中找到由未知空格数分隔的字符串中的第一个单词和第二个单词?我需要运行一个查询来获得预期的结果。

字符串:

Hello     Monkey this         is me

不同的句子在第一个和第二个词之间有不同的空格数,我需要一个通用的查询来得到结果。

预期结果:

Hello
Monkey

我设法使用substrinstr找到第一个单词。但是,由于第一个和第二个单词之间的空格数量未知,我不知道如何找到第二个单词。

select substr((select ltrim(sentence) from table1),1,
(select (instr((select ltrim(sentence) from table1),' ',1,1)-1) 
from table1)) 
from table1

3 个答案:

答案 0 :(得分:1)

由于您似乎希望它们作为单独的结果行,您可以使用简单的公用表表达式来复制行,一次使用完整行,然后删除第一个单词。然后,您所要做的就是从每个单词中获取第一个单词;

WITH cte AS (
  SELECT value FROM table1
  UNION ALL  
  SELECT SUBSTR(TRIM(value), INSTR(TRIM(value), ' ')) FROM table1
)
SELECT SUBSTR(TRIM(value), 1, INSTR(TRIM(value), ' ') -1) word
FROM cte

请注意,这个非常简单的示例假设 是第二个单词,如果没有,则会为两个单词返回NULL。

An SQLfiddle to test with

答案 1 :(得分:0)

虽然Joachim Isaksson的答案是一种强大而快速的方法,但您也可以考虑拆分字符串并从结果片组中进行选择。如果您的要求发生变化(例如,超过两个字符串片段),这只是作为另一种方法的提示。

您最终可以通过正则表达式/[ ]+/进行拆分,从而获取空白之间的单词。

在此处详细了解拆分:How do I split a string so I can access item x?

这很大程度上取决于您使用的SQL方言。

答案 2 :(得分:0)

使用REGEXP_SUBSTR尝试此操作:

SELECT
  REGEXP_SUBSTR(sentence,'\w+\s+'),
  REGEXP_SUBSTR(sentence,'\s+(\w+)\s'),
  REGEXP_SUBSTR(sentence,'\s+(\w+)\s+(\w+)'),
  REGEXP_SUBSTR(REGEXP_SUBSTR(sentence,'\s+(\w+)\s+(\w+)'),'\w+$'),
  REGEXP_SUBSTR(sentence,'\s+(\w+)\s+$')
FROM table1;

结果:

1       2       3               4       5
Hello   Monkey  Monkey this     this    is_me 

详细了解REGEXP_SUBSTR对Using Regular Expressions With Oracle Database

的引用

测试使用SqlFiddle:http://sqlfiddle.com/#!4/8e9ef/9

如果您只想获得第一个和第二个单词,请使用REGEXP_INSTR获取第二个单词的起始位置:

SELECT
  REGEXP_SUBSTR(sentence,'\w+\s+') AS FIRST,
  REGEXP_SUBSTR(sentence,'\w+\s',REGEXP_INSTR(sentence,'\w+\s+')+length(REGEXP_SUBSTR(sentence,'\w+\s+'))) AS SECOND
FROM table1;