我有一张这样的桌子.Col2是字符串类型:

| Col1         | Col2                               |
|--------------|------------------------------------|
| some_string  |{siblings:0, pets:1, have_friends:0}|
| some_string  |{siblings:0, pets:0, have_friends:0}|
| some_string  |{siblings:1, pets:2, have_friends:3}|
| some_string  |{siblings:1, pets:1, have_friends:0}|

我想使用SQL来解析Col2上的Key:Value对,并筛选出值为"0"的对,这样输出就是:

| Col1         | Col2                               |
|--------------|------------------------------------|
| some_string  |{pets:1}                            |
| some_string  |{}                                  |
| some_string  |{siblings:1, pets:2, have_friends:3}|
| some_string  |{siblings:1, pets:1}                |

谁来帮帮忙?

推荐答案

因此,让我们创建模式:

create table mytable(col1 text, col2 text);

insert into mytable(col1, col2)
values
('some_string', '{key1:0, key2:1, key3:0}'),
('some_string', '{key1:0, key2:0, key3:0}'),
('some_string', '{key1:1, key2:2, key3:3}'),
('some_string', '{key1:1, key2:1, key3:0}');

要计算所需的值,请使用

select col2 as input, regexp_replace(col2, '(, )?key\d:0(, )?', '', 'g') as output
from mytable;

如果您想要 Select 它们.regexp_replace用新的字符串(参数3)替换模式(参数2)的字符串(参数1)中的匹配.g指定要替换所有匹配项.

菲德尔:

https://www.db-fiddle.com/f/omvF3XLrmCpYM79YYTA1wH/0

如果您需要更新值,则可以:

update mytable
set col2 = regexp_replace(col2, '(, )?key\d:0(, )?', '', 'g');

菲德尔: https://www.db-fiddle.com/f/omvF3XLrmCpYM79YYTA1wH/1

编辑

您可以以您喜欢的方式增强模式的正则表达式.如果要支持任何小写或大写以及数字和下划线的字符,请try :

select col2 as input, regexp_replace(col2, '(, )?[a-z_A-Z0-9]*:0(, )?', '', 'g') as output
from mytable;

菲德尔: https://www.db-fiddle.com/f/omvF3XLrmCpYM79YYTA1wH/2

Sql相关问答推荐

Microsoft Access UNION将长文本字段限制为255个字符

为表中每个缺少的引用创建新行

从原始表列中经过JSON字符串化的对象数组构建视图

如果元素包含通过SQL指定的字符串,则过滤掉数组元素

从字符串中删除";1、";和";2,";,而不删除";11、";和";12、";

对表进行多项 Select 以返回最大值和时间

如何在Postgres中为单值输入多行?

Postgres SQL查询从字符串中获取邮箱地址

SQL查询正在工作,但返回空结果

使用 Oracle SQL Developer 将不同的列值转换为列会导致错误 ORA-01489

特殊条件计算小计

获取多个开始-结束时间戳集之间经过的时间

根据不同日期标准分配组的逻辑

SQL中如何转置表格 UNPIVOT是唯一的 Select 吗?

SQL - 只需要 GROUP BY SELECT 的一列

Set vs let vs 在snowflake中声明变量

如何在 PL/SQL 中区分返回的 XML 值?

使用标准SQL 触发更新当前日期

为什么这是 AND,OR with NULL 的真值表?

如何刷新在视图之上创建的表