Oracle SQL -需要提取分隔符之间的字符串[重复]

dgenwo3n  于 2023-10-16  发布在  Oracle
关注(0)|答案(2)|浏览(150)

此问题已在此处有答案

How to get the nth string from the delimited strings using REGEXP_SUBSTR in Oracle(2个答案)
上个月关门了。
我需要一个Oracle SQL语句从下面的例子中提取每个分隔符之间的文本,
NA$Sales$India/Blore$Hardware$Sold
输出应在不同的列中返回

Region     Department     Country        Product_type    Status
NA         Sales          India/Blore    Hardware        Sold

我尝试了下面的语句,但它只返回第一个字符串之后的字符串

SUBSTR('NA$Sales$India/Blore$Hardware$Sold', INSTR('NA$Sales$India/Blore$Hardware$Sold','$')+1, 
        INSTR('NA$Sales$India/Blore$Hardware$Sold','$') + INSTR('NA$Sales$India/Blore$Hardware$Sold','$')+ LENGTH(NA$Sales$India/Blore$Hardware$Sold)) AS test
2vuwiymt

2vuwiymt1#

一个简单的选择是使用正则表达式。
样本数据:

SQL> with test (col) as
  2    (select 'NA$Sales$India/Blore$Hardware$Sold' from dual)

查询方式:

3  select regexp_substr(col, '([^\$]+)', 1, 1) region,
  4         regexp_substr(col, '([^\$]+)', 1, 2) department,
  5         regexp_substr(col, '([^\$]+)', 1, 3) country,
  6         regexp_substr(col, '([^\$]+)', 1, 4) product_type,
  7         regexp_substr(col, '([^\$]+)', 1, 5) status
  8  from test;

REGION     DEPARTMENT      COUNTRY     PRODUCT_TYPE    STATUS
---------- --------------- ----------- --------------- --------
NA         Sales           India/Blore Hardware        Sold

SQL>

或者,如果您更喜欢substr + instr组合(具有相同的样本数据):

SQL> with test (col) as
  2    (select 'NA$Sales$India/Blore$Hardware$Sold' from dual)

查询方式:

3  select
  4  substr(col, 1, instr(col, '$', 1, 1) - 1) region,
  5  substr(col, instr(col, '$', 1, 1) + 1,
  6              instr(col, '$', 1, 2) - instr(col, '$', 1, 1) - 1
  7        ) department,
  8  substr(col, instr(col, '$', 1, 2) + 1,
  9              instr(col, '$', 1, 3) - instr(col, '$', 1, 2) - 1
 10        ) country,
 11  substr(col, instr(col, '$', 1, 3) + 1,
 12              instr(col, '$', 1, 4) - instr(col, '$', 1, 3) - 1
 13        ) product_type,
 14  substr(col, instr(col, '$', 1, 4) + 1) status
 15  from test;

REGION     DEPARTMENT      COUNTRY     PRODUCT_TYPE    STATUS
---------- --------------- ----------- --------------- --------
NA         Sales           India/Blore Hardware        Sold

SQL>
fdbelqdn

fdbelqdn2#

您可以使用REGEX_SUBSTR提取由美元符号分隔的文本。请注意,在正则表达式中,美元符号必须用'$'转义,因为它具有特殊含义(行尾)。REGEX_SUBSTR的最后一个参数决定提取哪个所谓的 group。(组用括号表示。)

select
    regexp_substr(text, '^(.*)\$(.*)\$(.*)\$(.*)\$(.*)$', 1, 1, 'i', 1) "Region",
    regexp_substr(text, '^(.*)\$(.*)\$(.*)\$(.*)\$(.*)$', 1, 1, 'i', 2) "Department",
    regexp_substr(text, '^(.*)\$(.*)\$(.*)\$(.*)\$(.*)$', 1, 1, 'i', 3) "Country",
    regexp_substr(text, '^(.*)\$(.*)\$(.*)\$(.*)\$(.*)$', 1, 1, 'i', 4) "Product_type",
    regexp_substr(text, '^(.*)\$(.*)\$(.*)\$(.*)\$(.*)$', 1, 1, 'i', 5) "Status"
from (
    select 'NA$Sales$India/Blore$Hardware$Sold' text
    from dual
);

结果是:
| 区域|部|国家|产品类型|地位|
| --|--|--|--|--|
| NA|销售|印度/布洛尔|硬件|出售|

相关问题