用于从包含 Null 的逗号分隔列表中选择特定值的正则表达式解决方案
使用 REGEXP_SUBSTR 从逗号分隔列表中提取第 n 个值时(),处理空值可能很棘手。下面是对该问题的详细检查和全面的解决方案。
首先,考虑以下场景:
SQL> select REGEXP_SUBSTR('1,2,3,4,5,6', '[^,]+', 1, 2) data from dual; D - 2
此查询成功检索了第二个非空值(“2”)使用正则表达式 [^,] 的列表。但是,当第二个值为 null 时,查询将返回第三项:
SQL> select REGEXP_SUBSTR('1,,3,4,5,6', '[^,]+', 1, 2) data from dual; D - 3
要解决此问题,需要更灵活的正则表达式来允许可选字符:
SQL> select REGEXP_SUBSTR('1,,3,4,5,6', '[^,]*', 1, 4) data from dual; D - 3
然而,这个正则表达式对于超过空值的数字也会失败。
最终,解决方案在于更复杂的方法正则表达式:
REGEX_SUBSTR('1,,3,4,5', '(.*?)(,|$)', 1, 2, NULL, 1)
此正则表达式捕获第 n 次出现逗号或行尾之前的数据。结果是:
Data ----
要将此解决方案封装到可重用的函数中,请考虑以下代码:
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;
可以像这样调用此函数:
select get_list_element('123,222,,432,555', 4) from dual;
无论潜在的空值或选择的特定元素如何,该解决方案都提供了一种强大而优雅的方法,用于从逗号分隔的列表中提取值Oracle SQL。
以上是如何在 SQL 中可靠地从逗号分隔列表中提取第 N 个值并处理空值?的详细内容。更多信息请关注PHP中文网其他相关文章!