2016-07-29 2 views
0

Как выбрать abcdef.txt из следующей строки?Oracle SQL - выберите части строки

abcdef.123.txt 

Я только знаю, как выбрать ABCDEF, делая select substr('abcdef.123.txt',1,6) from dual;

+0

является форматом * всегда * фиксированные алфавиты с последующим '.' следовал ряд с последующим' .' последующие алфавитами? –

+0

@vkp да формат всегда фиксирован. – user3224907

ответ

2

Вы можете с помощью || для CONCAT и подстрока -3 для правой части

select substr('abcdef.123.txt',1,6) || '.' ||substr('abcdef.123.txt',-3) from dual; 

или избежать CONCAT (как предложил Люк M)

select substr('abcdef.123.txt',1,7) || substr('abcdef.123.txt',-3) from dual; 
+0

Вы можете извлечь точку, чтобы избежать конкатенации. –

+0

@LucM есть несколько способов сделать это .. Я только что предложил один из способов, и у меня есть обновленный ответ с вашим предложением тоже .. – scaisEdge

2

общее решение, предполагающей строку ввода имеет ровно два периода . и вы хотите для извлечения первого и третьего токенов, разделенных одним .. Длина «токенов» во входной строке может быть произвольной (включая ноль!), и они могут содержать любые символы, отличные от .

select regexp_replace('abcde.123.xyz', '([^.]*).([^.]*).([^.]*)', '\1.\3') as result 
    from dual; 

RESULT 
--------- 
abcde.xyz 

Объяснение:

  • [ ] означает матч любой из символов между скобками.
  • ^ означает НЕ совпадают символы в скобках - так ...
  • [^.] означает любой символ КРОМЕ .
  • * означает матч ноль или более вхождения, так как многие как возможно («жадный» матч)
  • (...) называется Подвыражения ... см ниже
  • '\1.\3 средства заменить оригинальную строку с первым подвыражением, а затем ., а затем ТРЕТЬИМ подвыражением.
1

Замените подстроку всего, что окружено точками (включительно), с одной точкой. Отсутствие зависимости от длины компонентов строки:

SQL> select regexp_replace('abcdef.123.txt', '\..*\.', '.') fixed 
    from dual; 

FIXED 
---------- 
abcdef.txt 

SQL> 
Смежные вопросы