как извлечь конкретное значение в oracle sql

как извлечь эту строку с помощью oracle sql или regex..

input : 'run_id, src_key, cd_key, **ml_orig as cde_value**, date_key, desc'
output: 'run_id, src_key, cd_key, **cde_value**, date_key, desc'

Я хочу вывести cde_val и заменить любое слово перед ним до тех пор, пока предыдущий столбец не будет разделен знаком «,», и после этого хочу сохранить другую строку без изменений.

перед cde_value до предыдущего столбца, разделенного ",".


person Sharvan Kumar    schedule 05.12.2018    source источник
comment
все столбцы перед cde до cde не повреждены как cde???   -  person nikhil sugandh    schedule 05.12.2018
comment
требуется образец входных данных   -  person nikhil sugandh    schedule 05.12.2018


Ответы (4)



Вы можете использовать

regexp_replace(val,'(^|, )[a-zA-Z_]+ as ','\1')

Объяснение регулярного выражения:

Второй аргумент regexp_replace — это шаблон для сопоставления. В данном случае это

  • (^|, ) соответствует либо началу строки, либо ,, за которым следует пробел.
  • [a-zA-Z_]+ соответствует один или несколько раз символам в диапазоне a-z или A-Z или _ (подчеркивание)
  • [[:space:]]as буквально соответствует пробелу, за которым следует as.

Третий аргумент — замещающий символ(ы). Здесь это \1 (имеется в виду первая группа), что означает, что вы сохраняете только начало части строки, предшествующей шаблону или ,[[:space:]].

Обратите внимание, что для ясности в пояснении используется [[:space:]]. Использование символа пробела или [[:space:]] будет работать при сопоставлении с образцом.

В контексте SQL вы будете заменять все имена столбцов, за которыми следует пробел, за которым следует ничего, что, как я полагаю, необходимо.

person Vamsi Prabhala    schedule 05.12.2018
comment
не могли бы вы объяснить этот синтаксис, как он работает - person Sharvan Kumar; 05.12.2018
comment
дал некоторое объяснение используемых аргументов. - person Vamsi Prabhala; 05.12.2018

это будет работать:

select run_id, src_key, cd_key, (select regexp_replace(ml_orig,'(.)*',
run_id||','||src_key||','|| cd_key)from tablename) as cde_value, date_key, desc 
from table name;

пример ввода-вывода:

SELECT * FROM D061_WORDS;
nikhil sugandh
punam sugandh
mohit sugandh
select regexp_replace(a,'(.)* {1}',','||'sugandh') from d061_WORDS;
,sugandhsugandh
,sugandhsugandh
,sugandhsugandh
person nikhil sugandh    schedule 05.12.2018

Не пренебрегайте тестированием целевого шаблона во всех возможных позициях в строке, в том числе вообще не там. Всегда ожидайте неожиданного! Этот метод использует 3 группы захвата. Первая — это начало строки или всех символов, за которыми следует пробел перед второй группой. Вторая группа состоит из одного или нескольких словесных символов (az, A-Z, 0-9, включая символ подчеркивания _), за которыми следует 'as'. Третья группа захвата — остальная часть линии.

Это заменено 1-й и 3-й группами захвата, эффективно удаляющими слово перед и включая «как». Начинается с позиции 1, делает это для всех вхождений, игнорируя регистр.

SQL> with tbl(id, str) as (
     select 1, 'run_id, src_key, cd_key, ml_orig as cde_value, date_key, desc' from dual union all
     select 2, 'ml_orig as cde_value, run_id, src_key, cd_key, date_key, desc' from dual union all
     select 3, 'run_id, src_key, cd_key, date_key, desc, ml_orig as cde_value' from dual union all
     select 4, 'run_id, src_key, cd_key, date_key, desc, ml_orig as cde_value' from dual union all
     select 5, 'ml_oria as run_id, ml_orib as src_key, ml_oric as desc, ml_orid as cde_value' from dual union all
     select 6, NULL from dual union all
     select 7, 'run_id,ml_orig     as   src_key, cd_key, date_key, desc, ml_orig as cde_value' from dual
   )
   select id, regexp_replace(str, '(^|.*?, *)(\w+ +as +)(.*)', '\1\3', 1, 0, 'i') fixed
   from tbl;

        ID FIXED
---------- --------------------------------------------------
         1 run_id, src_key, cd_key, cde_value, date_key, desc
         2 cde_value, run_id, src_key, cd_key, date_key, desc
         3 run_id, src_key, cd_key, date_key, desc, cde_value
         4 run_id, src_key, cd_key, date_key, desc, cde_value
         5 run_id, src_key, desc, cde_value
         6
         7 run_id,src_key, cd_key, date_key, desc, cde_value

7 rows selected.

SQL>
person Gary_W    schedule 05.12.2018
comment
Как насчет этой строки 'run_id, src_key, cd_key, date_key, desc,ml_orig as cde_value - проблема, которую я получаю, заключается в том, что строка не является постоянной, это будет строка в таблице, некоторые данные строки строки будут иметь двойной пробел перед as или/и после . Это регулярное выражение не работает regexp_replace(x,'(^|,)+[a-zA-Z_]+ AS ','\1') yy для двойного или множественного пробела. не могли бы вы посмотреть - person Sharvan Kumar; 05.12.2018
comment
Просто добавьте «+» после пробела для одного или нескольких во второй группе захвата. Вы должны были упомянуть об этом в своем исходном сообщении. Я отредактирую свой пост. - person Gary_W; 05.12.2018
comment
CDE_KEY, SRC_KEY,mil_orig AS CDE_VALUE, abc -- здесь после запятой пробела нет. так что не могли бы вы включить это также, что было бы выражением - person Sharvan Kumar; 05.12.2018
comment
Хорошо, я только что подправил регулярное выражение, чтобы учесть это. Однако он не заменяет его пробелом. Примечание ID 7 - person Gary_W; 05.12.2018