首页 > 解决方案 > postgresql:从文本中自动提取字符串

问题描述

我在 postgresl 数据库中有下表

        id  | species                                                                           
        ----+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
          1 |[{"id":1,"animalName":"Lupo appennico","animalCode":"LUPO"},{"id":2,"animalName":"Orso bruno marsicano","animalCode":"ORSO"},{"id":3,"animalName":"Volpe","animalCode":"VOLPE"}]
        ----+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------    
          2 |[{"id":1,"animalName":"Cinghiale","animalCode":"CINGHIALE"},{"id":2,"animalName":"Orso bruno marsicano","animalCode":"ORSO"},{"id":3,"animalName":"Cervo","animalCode":"CERVO"}]|

我想只提取 ' "animalName":' 之后的值并将它们放在一个新字段中。

        id  | new_field                                  |
        ----+--------------------------------------------+
          1 |Lupo appennico, Orso bruno marsicano,Volpe  |
        ----+--------------------------------------------+
          2 |Cinghiale, Orso bruno marsicano, Cervo      |

不幸的是,该字段是文本类型(不是 json 或数组)。我试过使用正则表达式但没有成功。

标签: sqljsonpostgresqlregexp-replace

解决方案


您的列不是 json 数据类型,但它似乎包含有效的 json。如果是这样,您可以对其进行强制转换并在其上使用 json 函数:

select id, string_agg(j ->> 'animalName', ', ') new_field
from mytable t
cross join lateral jsonb_array_elements(t.species::jsonb) j(obj)
group by id
order by id

DB Fiddle 上的演示

编号 | 新字段                                  
-: | :--------------------------------------------
 1 | 卢波·阿彭尼科、奥尔索·布鲁诺·马尔西卡诺、沃尔佩
 2 | Cinghiale、Orso bruno marsicano、Cervo     

推荐阅读