没有存储过程/函数的分隔符的Oracle SQL拆分

时间:2015-11-12 08:06:42

标签: sql oracle string-split

我想在oracle db中用分隔符(|)拆分列。我怎么能这样做?

在db中,值将存储为:

字段

AP1|Apple Juice|100

我想把它分开:

Field1 | Field2 | Field3

AP1 Apple Juice 100    

我不知道确切的查询,但基本上下面是我想要的。

select split(Field) as Field1, split(Field) as Field2, split(Field) as Field3

我想只使用SQL(不创建任何存储过程或函数)。

2 个答案:

答案 0 :(得分:5)

使用正则表达式:

with sample_data as
    (select 'AP1|Apple Juice|100' str
    from dual
)
select str,
     regexp_substr(str, '[^|]+', 1, 1) str1,
     regexp_substr(str, '[^|]+', 1, 2) str2,
     regexp_substr(str, '[^|]+', 1, 3) str3
from sample_data;

答案 1 :(得分:1)

您可以使用 SUBSTR INSTR 在纯 SQL 中提取分隔符|之间的子字符串。

对于简单的字符串操作,我更喜欢SUBSTR + INSTR方法,因为它是still faster than the REGEXP。当然,对于最近的版本,性能差异正在减小,但是,REGEXP仍然比旧的SUBTR+INSTR更加CPU密集。

例如,

SQL> WITH sample_data AS
  2    (SELECT 'AP1|Apple Juice|100' str
  3    FROM dual
  4    )
  5  -- end of sample_data mocking as a table
  6  SELECT str,
  7         SUBSTR(str, 1, instr(str, '|', 1,1) -1) str1,
  8         SUBSTR(str, instr(str, '|', 1, 1) + 1,
  9                   instr(str, '|', 1, 2) -
 10                  instr(str, '|', 1, 1) -1) str2,
 11         SUBSTR(str, instr(str, '|', 1, 2) + 1) str3
 12  FROM sample_data;

STR                 STR1                STR2                STR3
------------------- ------------------- ------------------- ----
AP1|Apple Juice|100 AP1                 Apple Juice         100

另一方面,您不应将数据存储为分隔字符串,这实际上是一个糟糕的设计。您应该标准化作为永久性修复。尽可能将属性存储在不同的列中,然后您就没有操作字符串来提取相应属性的开销。