将逗号分隔值拆分为Oracle中的列

use*_*090 11 sql oracle split

我返回的值为255个逗号分隔值.是否有一种简单的方法可以将这些分成不包含255个子列的列?

ROW  | VAL
----------- 
1    | 1.25, 3.87, 2, ... 
2    | 5, 4, 3.3, ....
Run Code Online (Sandbox Code Playgroud)

ROW | VAL | VAL | VAL ...
--------------------- 
1   |1.25 |3.87 | 2 ...     
2   | 5   | 4   | 3.3 ...
Run Code Online (Sandbox Code Playgroud)

Gar*_*y_W 18

谨防!'[^,]+'如果列表中有null元素,并且您希望该项目或其后的项目,则格式的regexp_substr表达式将不会返回预期值.考虑这个例子,其中第4个元素是NULL,我想要第5个元素,因此期望返回'5':

SQL> select regexp_substr('1,2,3,,5,6', '[^,]+', 1, 5) from dual;

R
-
6
Run Code Online (Sandbox Code Playgroud)

惊喜!它返回第5个NON-NULL元素,而不是实际的第5个元素!返回的数据不正确,您甚至可能无法捕获它.试试这个:

SQL> select regexp_substr('1,2,3,,5,6', '(.*?)(,|$)', 1, 5, NULL, 1) from dual;

R
-
5
Run Code Online (Sandbox Code Playgroud)

因此,上面修正的REGEXP_SUBSTR表示要查找第5次出现的0个或多个逗号分隔的字符,后跟逗号或行尾(允许下一个分隔符,可以是逗号或行尾)和当找到返回第一个子组时(数据不包括逗号或行尾).

搜索匹配模式'(.*?)(,|$)'解释:

(             = Start a group
.             = match any character
*             = 0 or more matches of the preceding character
?             = Match 0 or 1 occurrences of the preceding pattern
)             = End the 1st group
(             = Start a new group (also used for logical OR)
,             = comma
|             = OR
$             = End of the line
)             = End the 2nd group
Run Code Online (Sandbox Code Playgroud)

编辑:更多信息添加和简化了正则表达式.

有关详细信息,请参阅此文章,并建议将其封装在函数中以便于重用:REGEX从列表中选择第n个值,允许空值 这是我发现格式'[^,]+'有问题的帖子.不幸的是,这是你最常见的正则表达式格式,作为有关如何解析列表的问题的答案.我不禁想到所有不正确的数据'[^,]+'!


Gor*_*off 12

你可以使用regexp_substr():

select regexp_substr(val, '[^,]+', 1, 1) as val1, 
       regexp_substr(val, '[^,]+', 1, 2) as val2, 
       regexp_substr(val, '[^,]+', 1, 3) as val3, 
       . . .
Run Code Online (Sandbox Code Playgroud)

我建议您在Excel(或其他电子表格)中生成255个数字的列,并使用电子表格生成SQL代码.

  • 这不是一个正确的答案,因为问题明确指出"没有255 substr".另外,请注意Gary_W的答案,这是一个非常有效的问题. (3认同)