先上图:
SQL> Select Length('11,22223,435,567') From dual;
LENGTH('11,22223,435,567')
--------------------------
16
--(这个字符串长度才16个,但下面用‘*’的统计结果却有17个)
SQL> Select regexp_count('11,22223,435,567',',*') From dual;
REGEXP_COUNT('11,22223,435,567',',*')
-------------------------------------
17
---(注意‘ * ’ 和 ‘ + ’的区别)
SQL> Select regexp_count('11,22223,435,567',',+') From dual;
REGEXP_COUNT('11,22223,435,567',',+')
-------------------------------------
3
我用的是11g版本的oracle,尝试字符拆分看看‘ * ’,‘ + ’ 的区别
SQL> Select regexp_substr(str,'[, ]*',1,Level,'i') str
2 From (Select '11,22223,435,567' str From dual)
3 Connect By Level<=regexp_count(str,'[, ]*');
STR
--------------------------------------------------------------------------------------------------------------------------------
,
,
,
已选择17行。
SQL> Select regexp_substr(str,'[, ]+',1,Level,'i') str
2 From (Select '11,22223,435,567' str From dual)
3 Connect By Level<=regexp_count(str,'[, ]+');
STR
--------------------------------------------------------------------------------------------------------------------------------
,
,
,
已选择3行。
同样是对‘ ,’进行查找,结果却很不一样,
‘ * ’ 匹配前面的子表达式零次或多次
‘ + ’ 匹配前面的子表达式一次或多次
(我有一个猜想,这两个元字符都对字符串的字符进行逐一判断:
‘ + ’必须至少要有一次匹配上,匹配不上的直接过滤掉,所以只能找到3条数据;
‘ * ’可以有零次匹配上,即匹配不上他返回一个空值,所以应该有13行空值行,3行‘ , ’行,!!!重点就是最后多出一行空值行,这个很费解-_-||)
(做了多次测试都是最后出现空值,这让我怀疑是不是regexp_count统计有问题,所以我把查找字段直接设为空)
SQL> Select regexp_substr(str,'',1,Level,'i') str
2 From (Select '11,22223,435,567,' str From dual)
3 Connect By Level<=regexp_count(str,'');
STR
------------------------------------------------------------------------------------------------------------------------------------
已选择 1 行。
(所以我在想最后一个空值会不会是‘ * ’对每个字符做完判断之后又对整个字符串做了上面的空值查找)
(这个问题想了好几天了,完全不知道怎么去验证,想法始终是想法!-_-||)
看看有没有高手知道~~~