我返回的值为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代码.
| 归档时间: |
|
| 查看次数: |
38677 次 |
| 最近记录: |