Выбор данных по маске...

SQL-Talker
Дата: 17.03.2011 10:26:15
Есть некая маска, например 'A__B_'
Нужно из таблицы выбрать данные поля тип VARCHAR2 так чтобы значения отображались только символы из тех позиций для которых в маске стоит подчеркивание ('_')

Например, в таблице содержится:
1234567
qwert
asd


А на выходе получили
235
wet
sd


Как это можно было бы реализовать?
Elic
Дата: 17.03.2011 10:44:07
Прозрачнее всего - UDF
-2-
Дата: 17.03.2011 10:51:47
select 
   replace(
      utl_raw.cast_to_varchar2(
         utl_raw.bit_and(
            utl_raw.cast_to_raw('1234567'),
            utl_raw.bit_xor(
               utl_raw.cast_to_raw(rpad('A__B_', length('1234567'))), 
               utl_raw.translate(utl_raw.cast_to_raw(rpad('A__B_', length('1234567'))),'5F','A0') 
            ) 
         )
      ),
      chr(0), ''
   ) непрозрачно
from dual;

НЕПРОЗРАЧНО
----------- 
235   
SQL-Talker
Дата: 17.03.2011 11:48:27
-2-
select 
   replace(
      utl_raw.cast_to_varchar2(
         utl_raw.bit_and(
            utl_raw.cast_to_raw('1234567'),
            utl_raw.bit_xor(
               utl_raw.cast_to_raw(rpad('A__B_', length('1234567'))), 
               utl_raw.translate(utl_raw.cast_to_raw(rpad('A__B_', length('1234567'))),'5F','A0') 
            ) 
         )
      ),
      chr(0), ''
   ) непрозрачно
from dual;

НЕПРОЗРАЧНО
----------- 
235   


Спасибо, вроде, работает.
А почему "непрозрачно"?
-2-
Дата: 17.03.2011 12:05:48
SQL-Talker
А почему "непрозрачно"?
Представь, что тебе по этому выражению еще группировать придется. Или добавиться дополнительное условие для маски, типа # - оставлять только цифры.
Elic
Дата: 17.03.2011 12:08:00
SQL-Talker
А почему "непрозрачно"?
Непрозрачность - это пол беды. Существуют неоднобайтные кодировки.
SQL-Talker
Дата: 17.03.2011 12:44:45
Подозреваю, что это с помощью regexp-ов можно сделать. А я в них, по большому счету, не разбираюсь.
huliGUN
Дата: 17.03.2011 13:55:09
select replace(wm_concat(substr('СТРОКА',pos,1)),',','')
 from (
        select INSTRB(&mask,'_',1,occ) pos
         from
          (select level occ from dual connect by level<=length(&mask) order by 1 asc) 
         where INSTRB(&mask,'_',1,occ)!=0
      )
orawish
Дата: 17.03.2011 14:11:41
SQL-Talker
Подозреваю, что это с помощью regexp-ов можно сделать. А я в них, по большому счету, не разбираюсь.

можно и без них
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
With the Partitioning, OLAP and Real Application Testing options

SQL> with t0 as (select '123456790abcdefgh' s
  2                    ,'_00_00___00_' m
  3                from dual)
  4      ,t (lvl,s,m,r)
  5  as (select 1 lvl, '123456790abcdefgh' s
  6                  , '_00_00___00_' m
  7                  ,cast(decode(substr(m,1,1),'_'
  8                              ,substr(s,1,1)) as varchar2(4000)) r
  9        from t0
 10   union all
 11      select lvl+1, s ,m
 12            ,r||decode(substr(m,lvl,1),'_'
 13                      ,substr(s,lvl,1)) r
 14        from t
 15       where lvl <= length(m)
 16  )
 17     select max(r) r from t
 18  ;

R
----------------------------------------------------------------------------
114790c
huliGUN
Дата: 17.03.2011 14:25:55
orawish,

А вот про это можно подробнее :
with t (lvl,s,m,r) as (select ...)