2015-06-03 4 views
4

Мне нужно выбрать первые X слов в строке, где x может быть любым числом от 0 до 100. Есть простой способ сделать это? Я нашел следующий пример, чтобы выбрать первые 2 слова из строки:Извлечение первых X слов из строки в Oracle Выберите

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

Как бы выбрать первые X слово из строки, где X может быть числом от 0-100?

+0

В какой форме вам нужен результат? Как одна строка? Или один столбец за слово? Или одна строка за слово? –

+0

Как одна строка. Решение Рене ниже работало, за исключением того, что у меня есть несколько строк, у которых есть два пробела между ними, и они терпят неудачу. Это не его вина, потому что я не упоминал об этом. –

+0

@Robert Smith: Я обновил свой ответ, чтобы он работал с двумя (или более) пробелами между словами. –

ответ

3

Выбор первого четыре слова:

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; 
+0

Спасибо, сэр, работайте отлично! Элегантное решение. –

+0

Если есть два пробела, какими будут изменения? У меня есть строка, такая как «Привет, мир, это тест и т. Д.», Который имеет два пробела и не работает. Благодарю. –

+0

Пожалуйста, определите «failing», покажите пример. –

0

это будет делать это, но это может быть немного безвкусный, вместо «2» с количеством слов, чтобы найти

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

Предполагает слова всегда заканчивается пробелом

1

Этот метод принимает результат извлечения количество слов, которые вы хотите, а затем уменьшает несколько пробелов к одному:

РЕДАКТИРОВАТЬ: Это становится уродливым, но обернуто вокруг него TRIM(), чтобы избавиться от конечного пространства (после того, как выбрано последнее слово).

+0

Спасибо, очень хорошо работает. –

+0

Он работает, но только небольшая деталь заключается в том, что он оставляет дополнительное пространство в конце строки. –

+0

Хорошо, я добавил вокруг него TRIM(), чтобы удалить конечное пространство и обновить сообщение. Постскриптум Решение Рене тоже нуждается в этом. –