Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle REGEXPR\u SUBSTR_Regex_Oracle_Expression_Substr - Fatal编程技术网

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]
至少我们对相关的值对有一个可靠的表示法