Посоветуйте, как лучше разделить значение на слова

Alibek B.
Дата: 16.10.2015 11:25:43
В столбце значения представляют собой одно или несколько слов, разделенных пробелами (одним или несколькими подряд).
Мне нужно это значение разбить на две части:
- если слово одно, то значение1 равно значению, а значение2 равно пустой строке
- если слов несколько, то значение2 равно последнему слову, а значение1 включает в себя все слова, кроме последнего.
Значение1 будет впоследствии участвовать в джойнах. Как лучше его получать, с помощью регулярных выражений или с помощью INSTR?
Если лучше использовать регулярные выражения, не поможете составить шаблон?
"(.+)( .+)?" почему-то не находит последнего слова, также как "(.+?)( .+)?".

________________________
Мы смотрим с оптимизмом...
...в оптический прицел.
JDS
Дата: 16.10.2015 11:45:49
Alibek B., имхо короче и понятнее привести пример строки данных, которую надо разобрать и выходное значение (Форумлировки с "Значение1", "Значение2" сложно воспринимаются в пятницу ))
Alibek B.
Дата: 16.10.2015 11:55:18
Пожалуй отделять нужно не последнее слово, а первое.
Пример:
VALUEVALUE1VALUE2
Ainet_hrs_30000Ainet_hrs_30000
meter-circuit-burst 825000meter-circuit-burst 825000
meter-circuit-excess-burst 1650000meter-circuit-excess-burst 1650000
meter-circuit-rate rate-absolute 6600meter-circuit-rate rate-absolute 6600
JDS
Дата: 16.10.2015 12:02:16
JDS
Пожалуй отделять нужно не последнее слово, а первое.

Задача по-прежнему не ясна :(
Что значит последнее слово? Где? От чего отделять? Надо ж писать, чтоб тупые тоже понимали :(
Alibek B.
Дата: 16.10.2015 12:09:15
Слова разделяются пробелами.
Соответственно первое слово - это фрагмент значения до первого пробела (или же все значение, если пробелов нет).
С помощью INSTR я его получаю так: substr(V, 1, nvl(nullif(instr(V,' ',1),0),length(V))).
С помощью регулярных выражений должно быть что-то типа: regexp_replace('(.+)( .+)?', '\1')
Но почему-то этот шаблон '(.+)( .+)?' всегда выбирает все значение целиком.
JDS
Дата: 16.10.2015 12:11:19
SELECT regexp_substr('meter-circuit-burst 825000', '^.*\s') FROM dual
?
JDS
Дата: 16.10.2015 12:12:42
Точнее, так наверно:
SELECT regexp_substr('meter-circuit-burst 825000 32432432', '^.*?\s') FROM dual
Alibek B.
Дата: 16.10.2015 12:14:24
Нет, такой шаблон даст пустой результат на строках, не содержащих пробела.
Sayan Malakshinov
Дата: 16.10.2015 12:21:34
Alibek B.,

регулярка тут только зря будет тормозить, лучше decode(instr(...
Sayan Malakshinov
Дата: 16.10.2015 12:27:58
xtender,

with v(VALUE) as (
select 'Ainet_hrs_30000' from dual union all
select 'meter-circuit-burst 825000' from dual union all
select 'meter-circuit-excess-burst 1650000' from dual union all
select 'meter-circuit-rate rate-absolute 6600' from dual
)
select
   value
  ,regexp_substr(v.value,'^(.*?)( \w+?)$',1,1,'c',1) value1_regexp
  ,regexp_substr(v.value,'^(.*?)( \w+?)$',1,1,'c',2) value2_regexp
  ,decode(instr(v.value,' ',-1),0,v.value,substr(v.value,1,instr(v.value,' ',-1))) value1_instr
  ,decode(instr(v.value,' ',-1),0,v.value,substr(v.value,  instr(v.value,' ',-1))) value2_instr
from v