2010-02-25 3 views
0

Мне нужно написать немного SQL, который анализирует второе слово любой строки или если нет пробела, всю строку.Разбор второго слова в строке, в Oracle

Логика

'XXX YYYYY ZZZZZ' вернет YYYY,

'XXX YYY' вернуться бы YYY и

'XXXXXX' вернет XXXXXX.

Любые предложения? Есть ли способ использования SUBSTR и двух позиций внутри строки? Скорее, используя длину.

Большое спасибо

ответ

3
case 
    -- at least two words 
    when instr(c, ' ', 1, 1) > 0 then 
     case 
      -- at least three words 
      when instr(c, ' ', 1, 2) > 0 then 
       -- return text between first and last space 
       substr(
        c 
       , instr(c, ' ', 1, 1)+1       
       , instr(c, ' ', 1, 2) - instr(c, ' ', 1, 1) - 1 
       ) 
      else 
      -- return 2nd word (text after first space) 
       substr(c, instr(c, ' ', 1, 1)+1) 
     end 
    -- one word, return it 
    else c 
end 
+0

Сделано использование «инстр (с, '', 1, 2) - логика instr (c, ', 1, 1) - 1 ". Спасибо agian. – fras85

+0

Это хлопот, это точно. В MySQL я, вероятно, использовал бы функцию 'SUBSTRING_INDEX()', которая сделала бы ее значительно менее беспорядочной. –

+0

Это может быть хлопот, но в Oracle вы поместите свою логику в свой собственный пакет утилиты, и вы будете иметь ее в любое время. – Rene

-1

Это может быть немного более простым, если вы знаете о регулярных выражениях:

SELECT CASE WHEN REGEXP_COUNT('STRING', ' ') > 0 THEN 
    REGEXP_SUBSTR ('STRING', '(\s)(\S*)',1,1) 
ELSE 
    'STRING' 
END 

FROM DUAL 
Смежные вопросы