Обновление строки, основанное на преобразовании другой строки (Oracle) - PullRequest
1 голос
/ 04 июля 2019

У меня есть таблица с несколькими (~ 100) строками.Один из столбцов представляет собой список строк, разделенных запятыми, которые могут содержать или не содержать пробелы.Теперь мне нужен еще один столбец, который является преобразованием этого столбца: удалить пробелы, разделить запятой, отсортировать в алфавитном порядке и объединить снова с запятой.

У меня есть следующий SQL, который работает для одной строки (все остальные строки получаютто же значение), но я не могу понять, как заставить его работать на всей таблице.Я, вероятно, скучаю по тому, где, но не могу понять, как это правильно:

update client set sorted = (select listagg(somedata, ',') 
    within group (order by somedata) somedata from (
    with q as (select ','||regexp_replace(unsorted, '\s+', '') as somedata 
    from client)
select regexp_substr(somedata, ',([^,]+)',1,rownum,'i',1) somedata
from q,
(select 1 from q connect by level <= length(regexp_replace(somedata, '[^,]', '')))
));

Чего мне не хватает?Спасибо.

1 Ответ

2 голосов
/ 04 июля 2019

Использовать коррелированный подзапрос:

Установка Oracle :

CREATE TABLE client ( unsorted, sorted ) AS
  SELECT 'b , c  ,e f, d, a', CAST( NULL AS VARCHAR2(30) ) FROM DUAL UNION ALL
  SELECT 'z , y, x,w,v ,u', CAST( NULL AS VARCHAR2(30) ) FROM DUAL;

Обновление

UPDATE client c
SET sorted = (
  SELECT LISTAGG(
           REGEXP_REPLACE( REGEXP_SUBSTR( c.unsorted, '[^,]+', 1, LEVEL ), '\s+' ),
           ','
         ) WITHIN GROUP (
           ORDER BY REGEXP_REPLACE( REGEXP_SUBSTR( c.unsorted, '[^,]+', 1, LEVEL ), '\s+' )
         )
  FROM   DUAL
  CONNECT BY LEVEL <= REGEXP_COUNT( c.unsorted, ',' ) + 1
)

выход

SELECT * FROM client;
UNSORTED          | SORTED     
:---------------- | :----------
b , c  ,e f, d, a | a,b,c,d,ef 
z , y, x,w,v ,u   | u,v,w,x,y,z

дБ <> скрипка здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...