как да извлечете определена стойност в 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)


Опитвам:

WITH src AS (
  SELECT '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' X
  FROM dual
)
SELECT x, regexp_replace( x, '(.*,)[^,]+as cde_value(.*)', '\1replacment\2') xx
FROM src

Демо: http://www.sqlfiddle.com/#!4/9fa35/2

before| 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 |
after | run_id, src_key, cd_key,replacment, date_key, desc' output: 'run_id, src_key, cd_key, cde_value, date_key, desc |
person krokodilko    schedule 05.12.2018
comment
Благодаря .. как мога да направя търсенето на as cde_value като нечувствително към главни и малки букви, - person Sharvan Kumar; 05.12.2018
comment
този регулярен израз няма да се справи с началото на низ и в настоящия си вид работи само за конкретна стойност. - person Vamsi Prabhala; 05.12.2018
comment
здравей krokodilko, можеш ли да ме уведомиш как мога да направя, ако низът в cde_val е в началото. напр. i/p ml_orig като cde_value, date_key, desc o/p cde_vale, date_key, desc - person Sharvan Kumar; 05.12.2018

Можеш да използваш

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

Обяснение на Regex:

Вторият аргумент на regexp_replace е моделът, който трябва да бъде съпоставен. В случая е така

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

Третият аргумент е символът(ите) за заместване. Тук е \1 (означава първата група), което означава, че запазвате само началото на частта от низ, предхождаща шаблона или ,[[:space:]].

Имайте предвид, че [[:space:]] е използвано в обяснението за яснота. Използването на буквален интервал или [[:space:]] ще работи при съвпадение на шаблон.

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

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 групи за улавяне. Първият е началото на реда или всички знаци, последвани от интервал, които се появяват преди втората група. Втората група е една или повече словни знаци (a-z, 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 като cde_value -- проблемът, който получавам е, че String не е постоянен, той ще бъде ред в таблицата, някои данни от низ на ред ще имат двойно пространство преди 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