oracle sqlの正規表現を使用せずに指定した以外の文字を置換する方法はありますか。oracle sqlでRegexを使わずに指定した以外の文字を置き換える方法は?
例の場合:
select replace ('rhythm','^h') from dual;
Expected result:
hh
oracle sqlの正規表現を使用せずに指定した以外の文字を置換する方法はありますか。oracle sqlでRegexを使わずに指定した以外の文字を置き換える方法は?
例の場合:
select replace ('rhythm','^h') from dual;
Expected result:
hh
は、非問題のように思えるが、あなたのような何かを行うことができます:
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')
);
h
とH
以外のすべての文字は、サブクエリでヌルとして報告され、listagg()
は、それらのNULL値を無視しています。 translate()
のように、除外する文字を指定する必要はありません。
私はあなたの例では、唯一の小文字h
を持っていたが、単一のエントリでin()
を持つことが奇妙に見えるので、私は@Mottorが何をしたかと一致する大文字H
を含めました知っています。とにかく拡張性があるので、興味のある文字をそのリストに入れることができます。
あなたは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;
あなたが書き込みすることなく、これを使用することができます)削除する文字:
正規表現が存在するためwith test(string, character) as
(
select 'rhythm','h' from dual
)
select rpad(character, length(string) - length(replace(string, character, '')),character)
from test
クール:)ですが、複数の文字では機能しません。 – Mottor
正規表現で何が問題になっていますか? –
実際には、問題は「文字を取り除く方法...」 – Mottor