【发布时间】:2014-10-28 05:02:18
【问题描述】:
我正在使用REGEXP_SUBSTR() 从逗号分隔列表中返回第 n 个值。当所有值都存在时,这工作正常,但如果项目为空,则失败。这是一个适用于所有值都存在的示例,并且我选择了第二次出现的 1 个或多个非逗号字符:
SQL> select REGEXP_SUBSTR('1,2,3,4,5,6', '[^,]+', 1, 2) data
2 from dual;
D
-
2
但是当第二个值为空时,我真的得到了列表中的第三个项目,这当然是第二次出现 1 个或多个不是逗号的字符。但是,我需要它返回 NULL,因为第二项是空的:
SQL> select REGEXP_SUBSTR('1,,3,4,5,6', '[^,]+', 1, 2) data
2 from dual;
D
-
3
如果我将正则表达式更改为允许零个或多个字符而不是 1 个或多个字符,那么对于超过 null 的数字也会失败:
SQL> select REGEXP_SUBSTR('1,,3,4,5,6', '[^,]*', 1, 4) data
2 from dual;
D
-
3
我需要允许 null 但似乎无法正确使用语法。从逻辑上讲,无论数据是否存在,我都需要返回第 n 次出现逗号之前的内容(并允许最后一个值)。有什么想法吗?
【问题讨论】:
-
这是重复的。解析带有空值的 csv 字符串是一个常见问题(例如stackoverflow.com/questions/25529511/…)。我偏爱我的解决方案(在字符串前面加一个逗号,并让你的正则表达式模式为 ',[^,]*'。接下来,LTRIM 匹配的 regexp_substr。
标签: sql regex oracle plsql oracle11g