我有一列包含键-值对中的值.但我只需要从该专栏中提取价值.

输入表:

+------+---------------------------------+
| Col1 |              Col2               |
+------+---------------------------------+
|    1 | key1:Val1;Key2:Val2;;;Key5:Val5 |
+------+---------------------------------+

预期输出:

+------+--------------------------------+------+------+------+------+
| Col1 |              Col2              | Col3 | Col4 | Col5 | Col6 |
+------+--------------------------------+------+------+------+------+
|    1 | key1:Val1;Key2:Val2;;Key4:Val4 | Val1 | Val2 |      | Val4 |
+------+--------------------------------+------+------+------+------+

解释:

因为Col2包含键-值对中的值,所以我只需要从其中提取value并将其存储在不同的列中,并且只要没有值,我们就需要将其置空.所以基本上,需要识别;:.

我的try :

SELECT
  Col1,
  SUBSTR(REGEXP_SUBSTR(Col1, 'Key1:(.*?)(;|$)', 1, 1, NULL, 1), 5) AS Col2
From table_name;

DB - Oracle Sql Developer tool
Version - 19c

我不确定这是否是处理这一需求并因此寻求帮助的最佳方式.

推荐答案

你使用的技术大体上是正确的,但有几个小问题:

  1. 您不会将模式锚定到词条的开头,因此如果您有数据kkey1:not this;key1:this并搜索key1,那么您将部分匹配kkey1键并得到错误的值.
  2. 您的数据混合了标题键和小写键,并且您只搜索标题大小写的键名称.
  3. 目前还不清楚为什么要使用SUBSTR,因为您是从正则表达式中提取捕获组,而不是整个匹配,因此您不需要删除键前缀.

如果你想将表UPDATE(即存储在不同的列中),那么用途:

UPDATE table_name
  SET col3 = REGEXP_SUBSTR(Col2, '(;|^)key1:(.*?)(;|$)', 1, 1, 'i', 2),
      col4 = REGEXP_SUBSTR(Col2, '(;|^)key2:(.*?)(;|$)', 1, 1, 'i', 2),
      col5 = REGEXP_SUBSTR(Col2, '(;|^)key3:(.*?)(;|$)', 1, 1, 'i', 2),
      col6 = REGEXP_SUBSTR(Col2, '(;|^)key4:(.*?)(;|$)', 1, 1, 'i', 2),
      col7 = REGEXP_SUBSTR(Col2, '(;|^)key5:(.*?)(;|$)', 1, 1, 'i', 2)

以下是样本数据的内容:

CREATE TABLE table_name (
  col1 VARCHAR2(20),
  col2 VARCHAR2(100),
  col3 VARCHAR2(20),
  col4 VARCHAR2(20),
  col5 VARCHAR2(20),
  col6 VARCHAR2(20),
  col7 VARCHAR2(20)
);

INSERT INTO table_name (col1, col2)
  VALUES (1, 'key1:Val1;Key2:Val2;;;Key5:Val5');

然后,在UPDATE之后,该表包含:

COL1 COL2 COL3 COL4 COL5 COL6 COL7
1 key1:Val1;Key2:Val2;;;Key5:Val5 Val1 Val2 null null Val5

如果只需要SELECT语句,则使用与SELECT语句中的UPDATE相同的REGEXP_SUBSTR函数调用:

SELECT col1,
       col2,
       REGEXP_SUBSTR(Col2, '(;|^)key1:(.*?)(;|$)', 1, 1, 'i', 2) AS col3,
       REGEXP_SUBSTR(Col2, '(;|^)key2:(.*?)(;|$)', 1, 1, 'i', 2) AS col4,
       REGEXP_SUBSTR(Col2, '(;|^)key3:(.*?)(;|$)', 1, 1, 'i', 2) AS col5,
       REGEXP_SUBSTR(Col2, '(;|^)key4:(.*?)(;|$)', 1, 1, 'i', 2) AS col6,
       REGEXP_SUBSTR(Col2, '(;|^)key5:(.*?)(;|$)', 1, 1, 'i', 2) AS col7
FROM  table_name;

fiddle

Sql相关问答推荐

将SEMI JOIN、ANTI JOIN转换为非连接SQL

SUM(条件)在Oracle?

GROUP BY和GROUP_CONCAT用于计算比赛排名

如何从上一个值减go 值

如何转换和汇总行数

从以前的非空值行中获取值

如何在不更改S代码的情况下,判断存储过程调用了多少次clr函数?

使用WHERE子句进行筛选时,SQL SELECT查询返回总计数

如何在SQL Server中拆分包含字符和数字的列?

从包含PostgreSQL中的JSON值的列中提取列表或目录

配置单元查询失败:无法识别';附近的输入;LEFT'';(select子句中的';';col'

SQL 搜索 - 获取最大值日期的奇怪行为

我可以在 T-SQL (SQL Server) 的函数内使用 OPTION 子句吗?

将空 JSON 数组添加到 SQL Server 表列中的 JSON 字符串

Postgresql:在链接表中判断相关表中插入值的条件

批量更改WooCommerce中所有产品的税收状态

过滤具有一对多关系的两个表之间的数据

查找具有相同连接列数据的所有记录

奇怪的甲骨文行为

如果当前日期是一周中的某一天,则从另一天提取结果