Если у вас никогда не будет слов длиной более 20 символов, вы можете наивно использовать:
SELECT REGEXP_SUBSTR( value, '\S{20,}' ) AS code,
value
FROM data d;
Однако, если у вас есть слова длиной более 20 символов, например:
CREATE TABLE data ( value ) AS
SELECT 'long words like floxinoxinihilipilification and antidisestablishmentarianism with your code 001/XYZ/0002/65432178' FROM DUAL UNION ALL
SELECT 'i would ?! like / to make * bb a8 001/XYZ/0002/65432178 thank you very much friends' FROM DUAL;
Затем приведенный выше код выдает:
CODE | VALUE
:-------------------------- | :----------------------------------------------------------------------------------------------------------------
floxinoxinihilipilification | long words like floxinoxinihilipilification and antidisestablishmentarianism with your code 001/XYZ/0002/65432178
001/XYZ/0002/65432178 | i would ?! like / to make * bb a8 001/XYZ/0002/65432178 thank you very much friends
Вместо этого вы можете попытаться сделать что-то вроде возврата слова, содержащего более 20 символов, которое также имеет наибольшее количество /
символов:
SELECT ( SELECT MAX( REGEXP_SUBSTR( d.value, '\S{20,}', 1, LEVEL ) ) KEEP ( DENSE_RANK LAST ORDER BY REGEXP_COUNT( REGEXP_SUBSTR( d.value, '\S{20,}', 1, LEVEL ), '/' ) )
FROM DUAL
CONNECT BY LEVEL <= REGEXP_COUNT( d.value, '\S{20}' )
) AS code,
value
FROM data d;
Какие выходы:
CODE | VALUE
:-------------------- | :----------------------------------------------------------------------------------------------------------------
001/XYZ/0002/65432178 | long words like floxinoxinihilipilification and antidisestablishmentarianism with your code 001/XYZ/0002/65432178
001/XYZ/0002/65432178 | i would ?! like / to make * bb a8 001/XYZ/0002/65432178 thank you very much friends
дБ <> скрипка здесь