我正在尝试使用 Oracle 中的 SQL 获取逗号分隔字符串中的第 n 个元素。
到目前为止我有以下..
SELECT regexp_substr(
'100016154,5101884LT00001,,,,,100000010892100000012655,L,SEI,5101884LT00001,1,SL,3595.03,00,2,N,N,G,N',
'[^,]+',
1,
7)
FROM dual;
但是当元素为空时它不起作用,即,有人可以帮忙吗?
我正在尝试使用 Oracle 中的 SQL 获取逗号分隔字符串中的第 n 个元素。
到目前为止我有以下..
SELECT regexp_substr(
'100016154,5101884LT00001,,,,,100000010892100000012655,L,SEI,5101884LT00001,1,SL,3595.03,00,2,N,N,G,N',
'[^,]+',
1,
7)
FROM dual;
但是当元素为空时它不起作用,即,有人可以帮忙吗?
如果您的分隔值在逗号之间始终是字母数字,那么您可以尝试:
SELECT REGEXP_SUBSTR( <delimied_string>, '[[:alnum:]]{0,},', 1, 7 )
FROM dual;
获取第七个值(包括尾随逗号)。如果它是空的,你只会得到尾随的逗号(你可以很容易地删除它)。
显然,如果您想要第七个以外的值,则将第四个参数值更改为您想要的任何第 n 个出现,例如
SELECT REGEXP_SUBSTR( <delimied_string>, '[[:alnum:]]{0,},', 1, <nth occurance> )
FROM dual;
编辑:因为我喜欢 REGEX,这里是一个解决方案,它也删除了尾随逗号
SELECT REPLACE(
REGEXP_SUBSTR(<delimied_string>, '[[:alnum:]]{0,},', 1, <nth>),
','
)
FROM dual;
希望能帮助到你
你可以用一个小技巧来做到这一点:首先用逗号替换所有逗号,然后是一个空格,然后跳过那个额外的前导空格:
SQL> with data as
2 ( select '100016154,5101884LT00001,,,,,100000010892100000012655,L,SEI,5101884LT00001,1,SL,3595.03,00,2,N,N,G,N' txt
3 from dual
4 )
5 select regexp_substr(txt,'[^,]+',1,7) seventh_element_wrong
6 , replace(txt,',',', ') with_extra_space_after_comma
7 , regexp_substr(replace(txt,',',', '),'[^,]+',1,7) seventh_element_leading_space
8 , substr(regexp_substr(replace(txt,',',', '),'[^,]+',1,7),2) the_seventh_element
9 from data
10 /
S WITH_EXTRA_SPACE_AFTER_COMMA
- ----------------------------------------------------------------------------------------------------------------------
SEVENTH_ELEMENT_LEADING_S THE_SEVENTH_ELEMENT
------------------------- ------------------------
1 100016154, 5101884LT00001, , , , , 100000010892100000012655, L, SEI, 5101884LT00001, 1, SL, 3595.03, 00, 2, N, N, G, N
100000010892100000012655 100000010892100000012655
问候,
罗布。
除非您坚持使用正则表达式,否则这也适用:
WITH q AS (
SELECT '100016154,5101884LT00001,,,,,100000010892100000012655,L,SEI,5101884LT00001,1,SL,3595.03,00,2,N,N,G,N' thestring FROM dual
)
SELECT SUBSTR(thestring, INSTR(thestring,',',1,6)+1,
INSTR(thestring,',',1,7)-INSTR(thestring,',',1,6)-1) "The Element"
FROM q;
The Element
------------------------
100000010892100000012655
另一种可能。您尚未指定数据的来源。您可以使用外部表来读取您的输入源并通过 SQL 处理它吗?
SELECT rtrim(regexp_substr('100016154,5101884LT00001,,,,,100000010892100000012655,L,SEI,5101884LT00001,1,SL,3595.03,00,2,N,N,G,N','[^,]{0,}[,]?',1,7),',')
FROM dual;