SELECT REGEXP_SUBSTR('34,56,-23', '[^,]+', 1, LEVEL, 'i') AS STR FROM DUAL CONNECT BY LEVEL <= LENGTH('34,56,-23') - LENGTH(REGEXP_REPLACE('34,56,-23', ',', '')) + 1;
以上的sql在sqlplus develop下执行能得到34,56,-23的结果集,但在程序中执行返回datatable的时候却是2行“,” 1行空的结果,这是为什么,求大神解释下
oracle regexp substr函数问题
- 写回答
- 好问题 0 提建议
- 关注问题
- 邀请回答
-
1条回答 默认 最新
你知我知皆知 2024-08-04 17:52关注以下回答参考 皆我百晓生、券券喵儿 等免费微信小程序相关内容作答,并由本人整理回复。
Oracle的REGEXP_SUBSTR函数是基于正则表达式的。它会根据给定的模式和位置来提取字符串中的子串。
你的SQL查询使用了
[^,]+作为模式,这意味着匹配到的是任何不是逗号(,)字符的任意数量的字符。然而,在你的CONNECT BY LEVEL <= ...语句中,你尝试将LENGTH('34,56,-23') - LENGTH(REGEXP_REPLACE('34,56,-23', ',', ''))的计算结果与LEVEL进行比较,并且由于这个计算可能是一个负数或零,所以结果是错误的。你应该先对
'34,56,-23'进行转换,然后减去REGEXP_REPLACE('34,56,-23', ',', ''),再除以LENGTH('34,56,-23')得到长度,然后再用LEVEL减去这个值,这样就能正确地获取到所需的结果。例如:
DECLARE l_length NUMBER; BEGIN l_length := LENGTH('34,56,-23'); l_length -= LENGTH(REPLACE('34,56,-23', ',', '')); -- 这里应该替换为 'REGEXP_REPLACE' SELECT REGEXP_SUBSTR('34,56,-23', '[^,]+', 1, LEVEL, 'i') INTO v_str FROM DUAL CONNECT BY LEVEL <= l_length; END;这将会获取到正确的结果:34, 56, -23。
解决 无用评论 打赏 举报