我想在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(不创建任何存储过程或函数)。
答案 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
另一方面,您不应将数据存储为分隔字符串,这实际上是一个糟糕的设计。您应该将标准化作为永久性修复。尽可能将属性存储在不同的列中,然后您就没有操作字符串来提取相应属性的开销。