Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql REGEXP\u用函数调用替换回引用_Sql_Oracle_Regexp Replace - Fatal编程技术网

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年,我就不能写这样的疑问了。我几乎说不出话来。