Oracle REGEXPR\u SUBSTR
我希望有人能给我一个好方法: 我有一个字符串:Oracle REGEXPR\u SUBSTR,regex,oracle,expression,substr,Regex,Oracle,Expression,Substr,我希望有人能给我一个好方法: 我有一个字符串: annual_sales:79139,annual_ind:A,q4_sales:22543,q4_ind:A,q3_sales:19153,q3_ind:A,q2_sales:19289,q2_ind:A,q1_sales:18155,q1_ind:A 字符串将始终具有相同的部分。始终使用逗号分隔10个部分。每两对一起穿。所以,你可以看到: annual_sales:79139 annual_ind:A q4_sales:22543 q4_i
annual_sales:79139,annual_ind:A,q4_sales:22543,q4_ind:A,q3_sales:19153,q3_ind:A,q2_sales:19289,q2_ind:A,q1_sales:18155,q1_ind:A
字符串将始终具有相同的部分。始终使用逗号分隔10个部分。每两对一起穿。所以,你可以看到:
annual_sales:79139
annual_ind:A
q4_sales:22543
q4_ind:A
q3_sales:19153
q3_ind:A
q2_sales:19289
q2_ind:A
q1_sales:18155
q1_ind:A
我需要两对来做必要的处理
我需要年销售额:79139
和年销售额:A
来处理这个问题
我需要q4\u sales:22543
和q4\u ind:A
来处理这个问题,以此类推
我希望通过一个循环和REGEXPR\u SUBSTR来获得这些对。也许循环5次,每次都得到我需要的一对
我可以用SUBSTR&INSTR来做这件事,但我希望REGEXPR能更干净一点
所以,提取前两对,做我需要的。获取第二对,做需要的事情,等等。我建议使用以下方法:
SELECT REGEXP_SUBSTR(SALES_STRING, '(annual_sales:)([^,]+)',1,1,NULL,2) AS ANNUAL_SALES,
REGEXP_SUBSTR(SALES_STRING, '(annual_ind:)([^,]+)',1,1,NULL,2) AS ANNUAL_IND,
REGEXP_SUBSTR(SALES_STRING, '(q1_sales:)([^,]+)',1,1,NULL,2) AS Q1_SALES,
REGEXP_SUBSTR(SALES_STRING, '(q1_ind:)([^,]+)',1,1,NULL,2) AS Q1_IND,
REGEXP_SUBSTR(SALES_STRING, '(q2_sales:)([^,]+)',1,1,NULL,2) AS Q2_SALES,
REGEXP_SUBSTR(SALES_STRING, '(q2_ind:)([^,]+)',1,1,NULL,2) AS Q2_IND,
REGEXP_SUBSTR(SALES_STRING, '(q3_sales:)([^,]+)',1,1,NULL,2) AS Q3_SALES,
REGEXP_SUBSTR(SALES_STRING, '(q3_ind:)([^,]+)',1,1,NULL,2) AS Q3_IND,
REGEXP_SUBSTR(SALES_STRING, '(q4_sales:)([^,]+)',1,1,NULL,2) AS Q4_SALES,
REGEXP_SUBSTR(SALES_STRING, '(q4_ind:)([^,]+)',1,1,NULL,2) AS Q4_IND
FROM YOUR_TABLE
其中您的表。SALES\u STRING
是包含该字符串的表和列。这将产生类似以下结果:
ANNUAL_SALES ANNUAL_IND Q1_SALES Q1_IND Q2_SALES Q2_IND Q3_SALES Q3_IND Q4_SALES Q4_IND
79139 A 18155 A 19289 A 19153 A 22543 A
祝你好运。我建议使用以下方法:
SELECT REGEXP_SUBSTR(SALES_STRING, '(annual_sales:)([^,]+)',1,1,NULL,2) AS ANNUAL_SALES,
REGEXP_SUBSTR(SALES_STRING, '(annual_ind:)([^,]+)',1,1,NULL,2) AS ANNUAL_IND,
REGEXP_SUBSTR(SALES_STRING, '(q1_sales:)([^,]+)',1,1,NULL,2) AS Q1_SALES,
REGEXP_SUBSTR(SALES_STRING, '(q1_ind:)([^,]+)',1,1,NULL,2) AS Q1_IND,
REGEXP_SUBSTR(SALES_STRING, '(q2_sales:)([^,]+)',1,1,NULL,2) AS Q2_SALES,
REGEXP_SUBSTR(SALES_STRING, '(q2_ind:)([^,]+)',1,1,NULL,2) AS Q2_IND,
REGEXP_SUBSTR(SALES_STRING, '(q3_sales:)([^,]+)',1,1,NULL,2) AS Q3_SALES,
REGEXP_SUBSTR(SALES_STRING, '(q3_ind:)([^,]+)',1,1,NULL,2) AS Q3_IND,
REGEXP_SUBSTR(SALES_STRING, '(q4_sales:)([^,]+)',1,1,NULL,2) AS Q4_SALES,
REGEXP_SUBSTR(SALES_STRING, '(q4_ind:)([^,]+)',1,1,NULL,2) AS Q4_IND
FROM YOUR_TABLE
其中您的表。SALES\u STRING
是包含该字符串的表和列。这将产生类似以下结果:
ANNUAL_SALES ANNUAL_IND Q1_SALES Q1_IND Q2_SALES Q2_IND Q3_SALES Q3_IND Q4_SALES Q4_IND
79139 A 18155 A 19289 A 19153 A 22543 A
祝你好运。这里有一个不需要标签硬编码的正则表达式解决方案。子查询每隔一个逗号拆分字符串,然后主查询将结果对拆分为两列
with t23 as (
select 'annual_sales:79139,annual_ind:A,q4_sales:22543,q4_ind:A,q3_sales:19153,q3_ind:A,q2_sales:19289,q2_ind:A,q1_sales:18155,q1_ind:A' str
from dual
)
, prs as (
select regexp_substr(str, '([^,]+,[^,]+)', 1, level) as pr
from t23
connect by level <= 5
)
select substr(pr, 1, instr(pr, ',')-1) as sales
, substr(pr, instr(pr, ',')+1) as ind
from prs
order by 1
;
如果您想要准备好加工的东西,我们可以购买fancier:
with t23 as (
select 'annual_sales:79139,annual_ind:A,q4_sales:22543,q4_ind:A,q3_sales:19153,q3_ind:A,q2_sales:19289,q2_ind:A,q1_sales:18155,q1_ind:A' str
from dual
)
, prs as (
select regexp_substr(str, '([^,]+,[^,]+)', 1, level) as pr
from t23
connect by level <= 5
)
select substr(pr, 1, instr(pr, '_')-1) as label
, ltrim(regexp_substr(pr, ':([0-9]+)'), ':') as sales
, substr(pr, -1, 1) as ind
from prs
order by 1
;
顺便提一下,这个问题说明了我的一个问题。这个问题之所以必要,是因为输入字符串的格式不好。内容中有一个隐式结构,而不是用字符串的结构来表示。现在是2018年,为什么我们仍然像这样传递数据?我们已经有了几十年的XML,从2001年起就有了JSON。没有借口 我同意这更详细,但处理起来更容易,更健壮:
"report": {
"annual" : {
"sales" : 79139
, "ind" : A
}
, "q1" : {
"sales" : 18155
, "ind" : A
}
, "q2" : {
"sales" : 19289
, "ind" : A
}
, "q3" : {
"sales" : 19153
, "ind" : A
}
, "q4" : {
"sales" : 22543
, "ind" : A
}
}
买你不必去完整的JSON。即便如此,这也将是一个显著的进步:
[annual_sales:79139,annual_ind:A],[q4_sales:22543,q4_ind:A],[q3_sales:19153,q3_ind:A],[q2_sales:19289,q2_ind:A],[q1_sales:18155,q1_ind:A]
至少我们对相关的值对有一个可靠的表示法。这里有一个正则表达式解决方案,它不需要对标签进行硬编码。子查询每隔一个逗号拆分字符串,然后主查询将结果对拆分为两列
with t23 as (
select 'annual_sales:79139,annual_ind:A,q4_sales:22543,q4_ind:A,q3_sales:19153,q3_ind:A,q2_sales:19289,q2_ind:A,q1_sales:18155,q1_ind:A' str
from dual
)
, prs as (
select regexp_substr(str, '([^,]+,[^,]+)', 1, level) as pr
from t23
connect by level <= 5
)
select substr(pr, 1, instr(pr, ',')-1) as sales
, substr(pr, instr(pr, ',')+1) as ind
from prs
order by 1
;
如果您想要准备好加工的东西,我们可以购买fancier:
with t23 as (
select 'annual_sales:79139,annual_ind:A,q4_sales:22543,q4_ind:A,q3_sales:19153,q3_ind:A,q2_sales:19289,q2_ind:A,q1_sales:18155,q1_ind:A' str
from dual
)
, prs as (
select regexp_substr(str, '([^,]+,[^,]+)', 1, level) as pr
from t23
connect by level <= 5
)
select substr(pr, 1, instr(pr, '_')-1) as label
, ltrim(regexp_substr(pr, ':([0-9]+)'), ':') as sales
, substr(pr, -1, 1) as ind
from prs
order by 1
;
顺便提一下,这个问题说明了我的一个问题。这个问题之所以必要,是因为输入字符串的格式不好。内容中有一个隐式结构,而不是用字符串的结构来表示。现在是2018年,为什么我们仍然像这样传递数据?我们已经有了几十年的XML,从2001年起就有了JSON。没有借口 我同意这更详细,但处理起来更容易,更健壮:
"report": {
"annual" : {
"sales" : 79139
, "ind" : A
}
, "q1" : {
"sales" : 18155
, "ind" : A
}
, "q2" : {
"sales" : 19289
, "ind" : A
}
, "q3" : {
"sales" : 19153
, "ind" : A
}
, "q4" : {
"sales" : 22543
, "ind" : A
}
}
买你不必去完整的JSON。即便如此,这也将是一个显著的进步:
[annual_sales:79139,annual_ind:A],[q4_sales:22543,q4_ind:A],[q3_sales:19153,q3_ind:A],[q2_sales:19289,q2_ind:A],[q1_sales:18155,q1_ind:A]
至少我们对相关的值对有一个可靠的表示法