You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Oracle中如何将test_rows表a_message字段的键值对转为列?

Oracle提取键值对字符串为列的解决方案

我创建了如下Oracle表test_rows,其中a_message字段存储了以键值对形式(如event==''abc'')的字符串数据:

CREATE TABLE test_rows(
id NUMBER(10), 
entity VARCHAR2(15), 
date_s DATE, 
a_message VARCHAR2(1000));

INSERT INTO test_rows 
VALUES(123, 'rat', sysdate, 
'event==''abc'' action==''add_mgmtmeetingdata'' employee_ids==''1;2'' entity==''mgmtmeeting_rat'' meeting_location==''New York'' meeting_type_code==''MSMT'' 
mgmt_meeting_date==''01/27/2010 00:00:00'' source_id==''ABC'' user==''TAM123'' work_object_id==''12345''  user==''TAM345''');

需要将a_message中的指定键值对(event、action、employee_ids、entity、meeting_location、meeting_type_code)提取为独立列,尝试使用REGEXP_SUBSTR和DECODE函数未得到预期结果,期望得到如下结构的查询结果:

eventactionemployee_idsentitymeeting_locationmeeting_type_code
abcadd_mgmtmeetingdata1;2mgmtmeeting_ratNew YorkMSMT

正确的查询语句

可以通过精准的正则匹配提取每个键对应的值,以下是可行的SQL语句:

SELECT
    REGEXP_SUBSTR(a_message, 'event==''([^'']+)''', 1, 1, 'i', 1) AS event,
    REGEXP_SUBSTR(a_message, 'action==''([^'']+)''', 1, 1, 'i', 1) AS action,
    REGEXP_SUBSTR(a_message, 'employee_ids==''([^'']+)''', 1, 1, 'i', 1) AS employee_ids,
    REGEXP_SUBSTR(a_message, 'entity==''([^'']+)''', 1, 1, 'i', 1) AS entity,
    REGEXP_SUBSTR(a_message, 'meeting_location==''([^'']+)''', 1, 1, 'i', 1) AS meeting_location,
    REGEXP_SUBSTR(a_message, 'meeting_type_code==''([^'']+)''', 1, 1, 'i', 1) AS meeting_type_code
FROM test_rows;

正则逻辑说明

  • 'event==''([^'']+)''':匹配event==''开头的片段,捕获所有非单引号的字符(即目标值),直到遇到下一个''
  • 最后一个参数1表示返回正则表达式中第一个捕获组的内容,也就是键对应的实际值
  • 'i'表示忽略大小写,可根据业务需求调整

内容的提问来源于stack exchange,提问作者RatnakarRao M

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 07:22:32