huidesy 2015-11-09 12:00 采纳率: 0%
浏览 2211

oracle regexp substr函数问题

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行空的结果,这是为什么,求大神解释下

  • 写回答

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。

    评论

报告相同问题?