Gar*_*y_W 5 regex sql oracle plsql oracle11g
我REGEXP_SUBSTR()
用来从逗号分隔列表中返回第n个值.这在所有值都存在时工作正常,但如果项为null则失败.这是一个适用于所有值存在的示例,我选择第二次出现的不是逗号的1个或多个字符:
SQL> select REGEXP_SUBSTR('1,2,3,4,5,6', '[^,]+', 1, 2) data
2 from dual;
D
-
2
Run Code Online (Sandbox Code Playgroud)
但是当第二个值为null时,我真的得到列表中的第三个项目,当然这实际上是第二个出现的1个或多个不是逗号的字符.但是,我需要它返回NULL,因为第二项是空的:
SQL> select REGEXP_SUBSTR('1,,3,4,5,6', '[^,]+', 1, 2) data
2 from dual;
D
-
3
Run Code Online (Sandbox Code Playgroud)
如果我将正则表达式更改为允许零个或多个字符而不是1或更多,则对于超过null的数字也会失败:
SQL> select REGEXP_SUBSTR('1,,3,4,5,6', '[^,]*', 1, 4) data
2 from dual;
D
-
3
Run Code Online (Sandbox Code Playgroud)
我需要允许null但似乎无法使语法正确.从逻辑上讲,我需要返回逗号第n次出现之前的数据是否存在(并允许最后一个值).有任何想法吗?
Gar*_*y_W 13
感谢那些回复的人.仔细阅读了所提供的链接中的答案和答案后,我得出了这个解决方案:
SQL> select REGEXP_SUBSTR('1,,3,4,5', '(.*?)(,|$)', 1, 2, NULL, 1) data
2 from dual;
Data
----
Run Code Online (Sandbox Code Playgroud)
这可以被描述为"查看第二次出现的一个可选的零个或多个字符后面跟着一个逗号或行的结尾,并返回第一个子组(这是数据减去逗号或结尾的线).
我忘了提到我在各个位置测试了null,多个空值,选择了各种位置等.
我能找到的唯一警告是,如果您查找的字段大于可用数字,它只返回NULL,因此您需要注意这一点.对我来说不是问题.
编辑:我正在更新已接受的答案,以便未来的搜索者可能偶然发现这一点.
下一步是封装代码,以便可以将其制作成更简单,可重用的函数.这是功能来源:
FUNCTION GET_LIST_ELEMENT(string_in VARCHAR2, element_in NUMBER, delimiter_in VARCHAR2 DEFAULT ',') RETURN VARCHAR2 IS
BEGIN
RETURN REGEXP_SUBSTR(string_in, '(.*?)(\'||delimiter_in||'|$)', 1, element_in, NULL, 1);
END GET_LIST_ELEMENT;
Run Code Online (Sandbox Code Playgroud)
这隐藏了开发人员的正则表达式复杂性,他们可能对它不太满意,并且在使用时无论如何都要使代码更清晰.像这样称它来获得第4个元素:
select get_list_element('123,222,,432,555', 4) from dual;
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
3568 次 |
最近记录: |