在 oracle sql 中拆分一个字符串数组

Split an array of strings in oracle sql

我想在 Oracle SQL 中使用 regex.substr 将一个列值拆分为多个列。此列包含两种格式的字符串

a) 字符串数组,例如:["abc","def"]

b) 单个字符串,例如 "abc"

我正在使用

regexp_substr(col1, '[^",]+', 1, 1) as val1,
regexp_substr(col1, '[^",]+', 1, 2) as val2,
regexp_substr(col1, '[^",]+', 1, 3) as val3,
regexp_substr(col1, '[^",]+', 1, 4) as val4,

使用上面的方法,我只能拆分格式 "b)"
对于格式 b),我得到以下结果

val1   val2   val3   val4
  [     abc   def     ]

我不希望结果中包含方括号。请建议如何进行。提前致谢!

regexp_substr(col1, '[^",]+', 1, 1)

它只会 return 数组中的 NON-NULL 个值。数组中可能有 NULL 个值,因此下面的查询将 return 考虑到 NULL 值的数组中元素的确切位置:

with data as 
(
  select '["abc","def","xyz","klm","nop","qrs"]' arr from dual union all
  select '["abc",,"xyz","klm","nop","qrs"]' arr from dual union all
  select '["abc","def",,"lkj",]' arr from dual
)
select 
    regexp_substr(arr, '(.*?)(,|$)', 1, 1, NULL, 1) col1,
    regexp_substr(arr, '(.*?)(,|$)', 1, 2, NULL, 1) col2,
    regexp_substr(arr, '(.*?)(,|$)', 1, 3, NULL, 1) col3,
    regexp_substr(arr, '(.*?)(,|$)', 1, 4, NULL, 1) col4,
    regexp_substr(arr, '(.*?)(,|$)', 1, 5, NULL, 1) col5,
    regexp_substr(arr, '(.*?)(,|$)', 1, 6, NULL, 1) col6
from 
(
 select replace(replace(replace(arr, '['), '"'), ']') arr from data
);

COL1 COL2 COL3 COL4 COL5 COL6
---- ---- ---- ---- ---- ----
abc  def  xyz  klm  nop  qrs 
abc       xyz  klm  nop  qrs 
abc  def       lkj