我有一列包含键值对中的值,但我只需要从该列中提取值。
输入表:
+------+---------------------------------+
| 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
并将其存储在不同的列中,并且在没有值的地方我们需要将其置为空。因此,基本上,需要识别;
和:
。
我的尝试:
SELECT
Col1,
SUBSTR(REGEXP_SUBSTR(Col1, 'Key1:(.*?)(;|$)', 1, 1, NULL, 1), 5) AS Col2
From table_name;
DB - Oracle Sql Developer tool
Version - 19c
型
我不知道这是否是处理这一要求的最佳方式,因此寻求帮助。
2条答案
按热度按时间piztneat1#
您使用的技术基本上是正确的,但存在一些小问题:
1.你没有将模式锚到一个词的开头,所以如果你有数据
kkey1:not this;key1:this
,你搜索key1
,那么你将部分匹配kkey1
键,得到错误的值。1.您的数据混合了标题和小写键,并且您只搜索标题大小写键名称。
1.目前还不清楚为什么要使用
SUBSTR
,因为您是从正则表达式中提取捕获组,而不是整个匹配,因此您不需要删除键前缀。如果你想对表进行
UPDATE
(即将其存储在不同的列中),那么用途:字符串
对于示例数据:
型
然后,在
UPDATE
之后,该表包含:| COL1| COL2| COL3| COL4| COL5| COL6| Col7|
| --|--|--|--|--|--|--|
| 1 |key1:Val1;Key2:Val2;Key5:Val5| Val1| Val2| * 空 | 空 *| Val5|
如果你只是想要一个
SELECT
语句,那么使用与SELECT
中的UPDATE
相同的REGEXP_SUBSTR
函数调用:型
fiddle
7kqas0il2#
这里有一种方法,使用
JSON_TABLE
将分隔列拆分为行,然后应用REGEXP_REPLACE
从键值对中提取值:字符串
Demo here