Преобразование одного столбца с помощью регулярного выражения в два столбца в Oracle 11.1g - PullRequest
3 голосов
/ 11 октября 2011

У меня есть эта строка в столбце (Oracle 11.1g) (на самом деле одно значение, но отформатировано, чтобы прояснить ситуацию):

#(#GLCTPAbstractSchedule 
    #(99 37800 nil) 
    #(nil nil nil) 
    #(nil nil nil) 
    #(10 45000 nil) 
    #(99 45000 nil) 
    #(nil nil nil) 
    #(nil nil nil) 
    #(99 55800 nil) 
    #(10 57900 nil) 
    #(99 70200 nil))

, и мне нужен этот результат в двух столбцах следующим образом

99 37800
10 45000
99 45000
99 55800
99 70200

Я пытаюсь использовать reg ex, но сейчас безуспешно.Кто-нибудь может помочь?Спасибо

Наконец я решил это

select REGEXP_SUBSTR(test, '[^ ]+', 1, 1) col_one,
       REGEXP_SUBSTR(test, '[^ ]+', 1, 2) col_two
       from (
        SELECT REGEXP_SUBSTR('
            #(#GLCTPAbstractSchedule#(99 37800 nil) #(nil nil nil) #(nil nil nil) #(10 45000 nil) #(99 45000 nil) #(nil nil nil) #(nil nil nil) #(99 55800 nil) #(10 57900 nil) #(99 70200 nil))'
            ,'[^#(]+[0-9]',1,ROWNUM) test
        FROM dual connect by rownum <= REGEXP_count('#(#GLCTPAbstractSchedule #(99 37800 nil) #(nil nil nil) #(nil nil nil) #(10 45000 nil) #(99 45000 nil) #(nil nil nil) #(nil nil nil) 
            #(99 55800 nil) #(10 57900 nil) #(99 70200 nil))', '\(\d')
);

Спасибо за помощь

К сожалению, это не совсем то, что я хочу, потому что у меня есть таблица со многими из этих строк # (#GLCTPAbstractSchedule .....

Я решил это, но кто-нибудь знает о лучшем решении?

 with
        tours as (
        SELECT * FROM (
            SELECT '2' stock_id, r.* FROM aa.bb@tab1.dd r
            UNION ALL
            SELECT '3' stock_id, o.* FROM aa.bb@tab2.dd o
            UNION ALL
            SELECT '4' stock_id, b.* FROM aa.bb@tab3.dd b
        )
    )
    SELECT
        trial_id,
        stock_id,
        DELIVERY_DATE_TYPE_ID, 
        to_char(to_date(DELIVERY_SECONDS,'sssss'),'hh24:mi') DELIVERY_HOUR 
    FROM (
        SELECT 
            trial_id,
            stock_id,
            REGEXP_SUBSTR(TRIAL_DELIVERY_DATE_TIME, '[^ ]+', 1, 1) DELIVERY_DATE_TYPE_ID,
            REGEXP_SUBSTR(TRIAL_DELIVERY_DATE_TIME, '[^ ]+', 1, 2) DELIVERY_SECONDS
        FROM (
            SELECT 
                stock_id, tournumber trial_id,
                    REGEXP_SUBSTR(
                        ABSTRACTSCHEDULE, regEx, 1, 1) t1,
                    REGEXP_SUBSTR(
                        ABSTRACTSCHEDULE, regEx, 1, 2) t2,
                    REGEXP_SUBSTR(
                        ABSTRACTSCHEDULE, regEx, 1, 3) t3,
                    REGEXP_SUBSTR(
                        ABSTRACTSCHEDULE, regEx, 1, 4) t4,
                    REGEXP_SUBSTR(
                        ABSTRACTSCHEDULE, regEx, 1, 5) t5,
                    REGEXP_SUBSTR(
                        ABSTRACTSCHEDULE, regEx, 1, 6) t6,
                    REGEXP_SUBSTR(
                        ABSTRACTSCHEDULE, regEx, 1, 7) t7,
                    REGEXP_SUBSTR(
                        ABSTRACTSCHEDULE, regEx, 1, 8) t8,
                    REGEXP_SUBSTR(
                        ABSTRACTSCHEDULE, regEx, 1, 9) t9,   
                    REGEXP_SUBSTR(
                        ABSTRACTSCHEDULE, regEx, 1, 10) t10    
                    FROM tours
            )
        unpivot (TRIAL_DELIVERY_DATE_TIME for n in (t1, t2, t3, t4, t5, t6, t7, t8, t9, t10))
    )

Ответы [ 3 ]

1 голос
/ 11 октября 2011

Учитывая данные этого теста ...

SQL> select col1 
   2  from t1
   3  /


COL1
--------------------------------------------------------------------------------
#(#GLCTPAbstractSchedule #(99 37800 nil) #(nil nil nil) #(nil nil nil) #(10 4500
0 nil) #(99 45000 nil) #(nil nil nil) #(nil nil nil) #(99 55800 nil) #(10 57900
nil) #(99 70200 nil))


SQL> 

... это сочетание новых SQL-функций RegEx и Old Skool дает желаемый результат:

SQL> select
  2    to_number(trim(substr(str,1,2))) as n1
  3    , to_number(trim(substr(str,4))) as n2
  4  from (    
  5    select replace(trim(regexp_substr (col1, '#\([0-9]+ [0-9]+', 1, level)), '#(') as str
  6    from t1
  7    where regexp_substr (col1, '#\([0-9]+ [0-9]+', 1, level) is not null
  8    connect by regexp_instr (col1, '#\([0-9]+ [0-9]+', 1, level) > 0
  9   )    
 10  /

 N1     N2
--- ------
 99  37800
 10  45000
 99  45000
 99  55800
 10  57900
 99  70200

6 rows selected.

SQL> 
1 голос
/ 11 октября 2011

Это лучшее, что я мог придумать (хотя мне пришлось использовать substr):

SELECT SUBSTR(REGEXP_SUBSTR('your string here', '[(][0-9]+',1,ROWNUM),2,999) AS col1,
       SUBSTR(REGEXP_SUBSTR('your string here', '[ ]+[0-9]+',1,ROWNUM),2,999) AS col2
FROM dual
CONNECT BY ROWNUM*2 <= REGEXP_COUNT('your string here','#')
0 голосов
/ 08 мая 2015

Это произошло, когда я просматривал оставшиеся без ответа вопросы, поэтому, хотя его старый кто-то может все еще найти его в поиске, вот мои 2 цента.

Для каждого экземпляра в строке набора из 2 цифр, пробела и 5 цифр, выберите первую подгруппу (первое число) как c1, а вторую (второе число) как c2.

with my_table(col1) as
( select '#(#GLCTPAbstractSchedule#(99 37800 nil) #(nil nil nil) #(nil nil nil) #(10 45000 nil) #(99 45000 nil) #(nil nil nil) #(nil nil nil) #(99 55800 nil) #(10 57900 nil) #(99 70200 nil))' from dual    
)
select regexp_substr(col1, '(\d{2}) (\d{5})', 1, level, NULL, 1) c1,
       regexp_substr(col1, '(\d{2}) (\d{5})', 1, level, NULL, 2) c2
from my_table
connect by level <= REGEXP_COUNT(col1, '\d{2} \d{5}');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...