替换功能未按预期工作
Replace function doesn't work as expected
我无法弄清楚为什么 REPLACE()
无法正常工作。
我得到的字符串格式为:
RISHON_LEZION-CMTSDV4,Cable7/0/4/U1;RISHON_LEZION-CMTSDV4,Cable7/0/4/U2;RISHON_LEZION-CMTSDV4,Cable7/0/5/U0;.....
最多 4000 个字符。
;
的每个点代表一个新的字符串(一个字符串最多可以有15个)。我通过使用 REPLACE()
拆分它 - ;
的每次出现都替换为 $
+ 向下一行 + 再次连接整个字符串(我有另一部分正在拆分字符串)
我认为字符串的长度对结果有一定的影响,尽管我从未听说过 replace 对字符串的长度有某种限制。
SELECT REPLACE(HOT_ALERTKEY_PK, ';', '$' || CHR(13) || CHR(10) || HOT_ALERTKEY_PK || '$')
from (SELECT 'RISHON_LEZION-CMTSDV4,Cable7/0/3/U0;RISHON_LEZION-CMTSDV4,Cable7/0/3/U1;RISHON_LEZION-CMTSDV4,Cable7/0/3/U2;RISHON_LEZION-CMTSDV4,Cable7/0/4/U0;RISHON_LEZION-CMTSDV4,Cable7/0/4/U1;RISHON_LEZION-CMTSDV4,Cable7/0/4/U2;RISHON_LEZION-CMTSDV4,Cable7/0/5/U0;RISHON_LEZION-CMTSDV4,Cable7/0/5/U1;RISHON_LEZION-CMTSDV4,Cable7/0/5/U2;RISHON_LEZION-CMTSDV4,Cable7/0/7/U0;RISHON_LEZION-CMTSDV4,Cable7/0/7/U1;RISHON_LEZION-CMTSDV4,Cable7/0/7/U2;RISHON_LEZION-CMTSDV4,Cable7/0/9/U0;RISHON_LEZION-CMTSDV4,Cable7/0/9/U1;RISHON_LEZION-CMTSDV4,Cable7/0/9/U2' as hot_alertkey_pk
FROM dual)
由于某种原因,这导致正确拆分字符串,直到 cable7/0/5/U0;
,然后停止。如果我从字符串的开头删除一个或多个部分(每个部分到半列),那么我将根据我从开头删除的数量将其添加到下一根电缆。
为什么会这样?
提前致谢。
如果在内查询中将示例输入字符串包裹在 to_clob()
内,而在外查询中将结果字符串包裹在 length()
内,您会发现结果为 8127 个字符。这回答了你的问题,但只是部分回答。
我不确定为什么 replace
没有抛出错误,或者只是将结果截断为 4000 个字符。我得到的结果与您在 Oracle 11.2 中得到的结果完全相同,结果在 3503 个字符后被截断。我只是快速查看了 replace()
的 Oracle 文档,它没有说明如果输入为 VARCHAR2 但输出超过 4000 个字符时的行为应该是什么。看起来好像它执行了尽可能多的替换然后停止了(下一个替换将超过 4000 个字符)。
我无法弄清楚为什么 REPLACE()
无法正常工作。
我得到的字符串格式为:
RISHON_LEZION-CMTSDV4,Cable7/0/4/U1;RISHON_LEZION-CMTSDV4,Cable7/0/4/U2;RISHON_LEZION-CMTSDV4,Cable7/0/5/U0;.....
最多 4000 个字符。
;
的每个点代表一个新的字符串(一个字符串最多可以有15个)。我通过使用 REPLACE()
拆分它 - ;
的每次出现都替换为 $
+ 向下一行 + 再次连接整个字符串(我有另一部分正在拆分字符串)
我认为字符串的长度对结果有一定的影响,尽管我从未听说过 replace 对字符串的长度有某种限制。
SELECT REPLACE(HOT_ALERTKEY_PK, ';', '$' || CHR(13) || CHR(10) || HOT_ALERTKEY_PK || '$')
from (SELECT 'RISHON_LEZION-CMTSDV4,Cable7/0/3/U0;RISHON_LEZION-CMTSDV4,Cable7/0/3/U1;RISHON_LEZION-CMTSDV4,Cable7/0/3/U2;RISHON_LEZION-CMTSDV4,Cable7/0/4/U0;RISHON_LEZION-CMTSDV4,Cable7/0/4/U1;RISHON_LEZION-CMTSDV4,Cable7/0/4/U2;RISHON_LEZION-CMTSDV4,Cable7/0/5/U0;RISHON_LEZION-CMTSDV4,Cable7/0/5/U1;RISHON_LEZION-CMTSDV4,Cable7/0/5/U2;RISHON_LEZION-CMTSDV4,Cable7/0/7/U0;RISHON_LEZION-CMTSDV4,Cable7/0/7/U1;RISHON_LEZION-CMTSDV4,Cable7/0/7/U2;RISHON_LEZION-CMTSDV4,Cable7/0/9/U0;RISHON_LEZION-CMTSDV4,Cable7/0/9/U1;RISHON_LEZION-CMTSDV4,Cable7/0/9/U2' as hot_alertkey_pk
FROM dual)
由于某种原因,这导致正确拆分字符串,直到 cable7/0/5/U0;
,然后停止。如果我从字符串的开头删除一个或多个部分(每个部分到半列),那么我将根据我从开头删除的数量将其添加到下一根电缆。
为什么会这样?
提前致谢。
如果在内查询中将示例输入字符串包裹在 to_clob()
内,而在外查询中将结果字符串包裹在 length()
内,您会发现结果为 8127 个字符。这回答了你的问题,但只是部分回答。
我不确定为什么 replace
没有抛出错误,或者只是将结果截断为 4000 个字符。我得到的结果与您在 Oracle 11.2 中得到的结果完全相同,结果在 3503 个字符后被截断。我只是快速查看了 replace()
的 Oracle 文档,它没有说明如果输入为 VARCHAR2 但输出超过 4000 个字符时的行为应该是什么。看起来好像它执行了尽可能多的替换然后停止了(下一个替换将超过 4000 个字符)。