Sql REGEXP\u用函数调用替换回引用
我可以对Sql REGEXP\u用函数调用替换回引用,sql,oracle,regexp-replace,Sql,Oracle,Regexp Replace,我可以对REGEXP\u REPLACE返回参考值使用一些函数调用吗 例如,我想调用chr()或任何其他返回参考值的函数,但是 SELECT REGEXP_REPLACE('a 98 c 100', '(\d+)', ASCII('\1')) FROM dual; 仅返回“\”的ASCII值: “a 92 c 92” 我希望先计算最后一个参数(替换字符串),然后再计算替换字符串。因此,结果将是: “a b c d” 我不是很聪明,可以使用一个正则表达式,但是,一步一步,像这样的东西可能会有所帮
REGEXP\u REPLACE
返回参考值使用一些函数调用吗
例如,我想调用chr()
或任何其他返回参考值的函数,但是
SELECT REGEXP_REPLACE('a 98 c 100', '(\d+)', ASCII('\1')) FROM dual;
仅返回“\”的ASCII值:
“a 92 c 92”
我希望先计算最后一个参数(替换字符串),然后再计算替换字符串。因此,结果将是:
“a b c d”
我不是很聪明,可以使用一个正则表达式,但是,一步一步,像这样的东西可能会有所帮助。它将源字符串拆分为行,检查其中是否有一部分是数字,如果是,则选择其中的
CHR
。最后,将所有内容聚合回单个字符串
SQL> with test (col) as
2 (select 'a 98 c 100' from dual),
3 inter as
4 (select level lvl,
5 regexp_substr(col, '[^ ]+', 1, level) c_val
6 from test
7 connect by level <= regexp_count(col, ' ') + 1
8 ),
9 inter_2 as
10 (select lvl,
11 case when regexp_like(c_val, '^\d+$') then chr(c_val)
12 else c_val
13 end c_val_2
14 from inter
15 )
16 select listagg(c_val_2, ' ') within group (order by lvl) result
17 from inter_2;
RESULT
--------------------
a b c d
SQL>
我不是很聪明,可以使用一个正则表达式,但是,一步一步,像这样的东西可能会有所帮助。它将源字符串拆分为行,检查其中是否有一部分是数字,如果是,则选择其中的
CHR
。最后,将所有内容聚合回单个字符串
SQL> with test (col) as
2 (select 'a 98 c 100' from dual),
3 inter as
4 (select level lvl,
5 regexp_substr(col, '[^ ]+', 1, level) c_val
6 from test
7 connect by level <= regexp_count(col, ' ') + 1
8 ),
9 inter_2 as
10 (select lvl,
11 case when regexp_like(c_val, '^\d+$') then chr(c_val)
12 else c_val
13 end c_val_2
14 from inter
15 )
16 select listagg(c_val_2, ' ') within group (order by lvl) result
17 from inter_2;
RESULT
--------------------
a b c d
SQL>
为了好玩,您可以使用XPath进行标记化、数字到字符的转换和聚合:
select *
from xmltable(
'string-join(
for $t in tokenize($s, " ")
return if ($t castable as xs:integer) then codepoints-to-string(xs:integer($t)) else $t,
" ")'
passing 'a 98 c 100' as "s"
);
Result Sequence
--------------------------------------------------------------------------------
a b c d
初始字符串值作为$s
传入;使用空格作为分隔符将其拆分;对生成的每个$t
进行求值,以查看它是否为整数,如果为整数,则通过将其转换为等效字符,否则将不使用它;然后,所有的令牌都被重新组合
如果原始版本运行了多个空格,这些空格将折叠为单个空格(就像Littlefoot的正则表达式一样)。只是为了好玩,您可以使用XPath进行标记化、数字到字符的转换和聚合:
select *
from xmltable(
'string-join(
for $t in tokenize($s, " ")
return if ($t castable as xs:integer) then codepoints-to-string(xs:integer($t)) else $t,
" ")'
passing 'a 98 c 100' as "s"
);
Result Sequence
--------------------------------------------------------------------------------
a b c d
初始字符串值作为$s
传入;使用空格作为分隔符将其拆分;对生成的每个$t
进行求值,以查看它是否为整数,如果为整数,则通过将其转换为等效字符,否则将不使用它;然后,所有的令牌都被重新组合
如果原始版本有多个空格,这些空格将折叠为一个空格(就像Littlefoot的正则表达式一样)。感谢您的快速响应,如果我的输入数据是这样的,您有什么建议吗?'a99c199e'?不客气。我编辑了我的信息;请看一看。谢谢您这么快的回复,如果我的输入数据是这样的:“a99c199e”,您有什么建议吗?不客气。我编辑了我的信息;请看一看。如果我活了1000年,我就不能写这样的查询了。我几乎说不出话来。如果我活了1000年,我就不能写这样的疑问了。我几乎说不出话来。