Как выбрать abcdef.txt
из следующей строки?Oracle SQL - выберите части строки
abcdef.123.txt
Я только знаю, как выбрать ABCDEF, делая select substr('abcdef.123.txt',1,6) from dual;
Как выбрать abcdef.txt
из следующей строки?Oracle SQL - выберите части строки
abcdef.123.txt
Я только знаю, как выбрать ABCDEF, делая select substr('abcdef.123.txt',1,6) from dual;
Вы можете с помощью || для 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;
Вы можете извлечь точку, чтобы избежать конкатенации. –
@LucM есть несколько способов сделать это .. Я только что предложил один из способов, и у меня есть обновленный ответ с вашим предложением тоже .. – scaisEdge
общее решение, предполагающей строку ввода имеет ровно два периода .
и вы хотите для извлечения первого и третьего токенов, разделенных одним .
. Длина «токенов» во входной строке может быть произвольной (включая ноль!), и они могут содержать любые символы, отличные от .
select regexp_replace('abcde.123.xyz', '([^.]*).([^.]*).([^.]*)', '\1.\3') as result
from dual;
RESULT
---------
abcde.xyz
Объяснение:
[ ]
означает матч любой из символов между скобками.^
означает НЕ совпадают символы в скобках - так ...[^.]
означает любой символ КРОМЕ .
*
означает матч ноль или более вхождения, так как многие как возможно («жадный» матч)(...)
называется Подвыражения ... см ниже'\1.\3
средства заменить оригинальную строку с первым подвыражением, а затем .
, а затем ТРЕТЬИМ подвыражением.Замените подстроку всего, что окружено точками (включительно), с одной точкой. Отсутствие зависимости от длины компонентов строки:
SQL> select regexp_replace('abcdef.123.txt', '\..*\.', '.') fixed
from dual;
FIXED
----------
abcdef.txt
SQL>
является форматом * всегда * фиксированные алфавиты с последующим '.' следовал ряд с последующим' .' последующие алфавитами? –
@vkp да формат всегда фиксирован. – user3224907