2016-04-11 9 views

答えて

2

は、非問題のように思えるが、あなたのような何かを行うことができます:

select listagg(c) within group (order by lvl) from 
(
    select level as lvl, 
    case when substr('rhythm', level, 1) in ('h', 'H') 
     then substr('rhythm', level, 1) end as c 
    from dual 
    connect by level <= length('rhythm') 
); 

hH以外のすべての文字は、サブクエリでヌルとして報告され、listagg()は、それらのNULL値を無視しています。 translate()のように、除外する文字を指定する必要はありません。

私はあなたの例では、唯一の小文字hを持っていたが、単一のエントリでin()を持つことが奇妙に見えるので、私は@Mottorが何をしたかと一致する大文字Hを含めました知っています。とにかく拡張性があるので、興味のある文字をそのリストに入れることができます。

1

あなたはTRANSLATE

SELECT TRANSLATE('rhythm', 'hHABCDEFGIJKLMNOPQRSTUVWXYZabcdefgijklmnopqrstuvwxyz', 'hH') 
    FROM DUAL; 

を使用することができますし、このここ@Aleksejのためである。

WITH t1 AS (SELECT 'rhythm bythm dubidah' s, 'ht' c FROM DUAL), 
    t2 AS (SELECT TRANSLATE (s, '@' || c, '@') st FROM t1), 
    t3 AS (SELECT LISTAGG (str, '') WITHIN GROUP (ORDER BY str) AS sm 
      FROM ( SELECT UNIQUE SUBSTR (st, LEVEL, 1) str 
         FROM t2 
       CONNECT BY LEVEL <= LENGTH (st))) 
SELECT TRANSLATE (s, c || sm, c) r 
    FROM t1 CROSS JOIN t3; 
1

あなたが書き込みすることなく、これを使用することができます)削除する文字:

正規表現が存在するため
with test(string, character) as 
(
select 'rhythm','h' from dual 
) 
select rpad(character, length(string) - length(replace(string, character, '')),character) 
from test 
+0

クール:)ですが、複数の文字では機能しません。 – Mottor

関連する問題