在Oracle 11g中解析数据

lndjwyie  于 2023-06-22  发布在  Oracle
关注(0)|答案(1)|浏览(165)

我有下面的数据在一个单一的列。
| 测试名称|
| - -----|
| 年龄:40岁|
| 市,部门|
| 大学名称|
| 受试者姓名|
| 匹配率75%|
| 电话号码"|
我需要分割这些数据,并将其插入到不同的列一样,通过使用SQL-

  1. NAME AGE CITY NAME_OF_UNI NAME_OF_SUB MATCH_PCT PHONE_NUM
0md85ypi

0md85ypi1#

理解样本数据的真实情况是很困难的(至少对我来说是这样);有一个冒号(作为名称-值分隔符),什么都没有,有双引号。所以,我稍微调整了一下,到处都用冒号。
样本数据:

  1. SQL> select * From test;
  2. COL
  3. --------------------------------------------------------------------------------
  4. Age:40
  5. City:
  6. University Name:
  7. Subject Name:
  8. Match Percentage: 75%
  9. Phone Number:
  10. Age:12
  11. City: Zagreb
  12. University Name: FER
  13. Subject Name: Maths
  14. Match Percentage: 23%
  15. Phone Number: 003851123456

查询:首先将每个列值拆分为单独的行,然后应用一个简单的case表达式,该表达式搜索冒号字符后面的任何内容。

  1. SQL> with tsplit as
  2. 2 (select rowid rid,
  3. 3 column_value lvl,
  4. 4 trim(regexp_substr(col, '[^' || chr(10) ||']+', 1, column_value)) val
  5. 5 from test cross join
  6. 6 table(cast(multiset(select level from dual
  7. 7 connect by level <= 6
  8. 8 ) as sys.odcinumberlist))
  9. 9 )
  10. 10 select
  11. 11 max(case when lvl = 1 then substr(val, instr(val, ':') + 1) end) age,
  12. 12 max(case when lvl = 2 then substr(val, instr(val, ':') + 1) end) city,
  13. 13 max(case when lvl = 3 then substr(val, instr(val, ':') + 1) end) university,
  14. 14 max(case when lvl = 4 then substr(val, instr(val, ':') + 1) end) subject,
  15. 15 max(case when lvl = 5 then substr(val, instr(val, ':') + 1) end) match,
  16. 16 max(case when lvl = 6 then substr(val, instr(val, ':') + 1) end) phone
  17. 17 from tsplit
  18. 18 group by rid;
  19. AGE CITY UNIVERSITY SUBJECT MATCH PHONE
  20. --- ---------- ------------ ---------- ---------- --------------
  21. 40 75%
  22. 12 Zagreb FER Maths 23% 003851123456
  23. SQL>

如果我的假设是错误的,那么调整query,使您不搜索冒号,而是分别搜索每个“name”字符串。但是,就总体思路而言,这可能是一种选择。

展开查看全部

相关问题