在 Redshift 中拆分一个 varchar 列

Posted

技术标签:

【中文标题】在 Redshift 中拆分一个 varchar 列【英文标题】:Split a varchar column in Redshift 【发布时间】:2020-12-31 13:48:17 【问题描述】:

我有一个表 sales,所有列的数据类型都是 varchar。

 Name           items 
 Dave    "item1": "product": apple, "cost": 120, "item2": "product": orange, "cost": 80
 Nick      
 Jack    "item1": "product": melon, "cost": 100, "item2": "product": berries, "cost": 240

我的目标是使用 SELECT 语句将列项拆分如下

Name    items1_product   items1_cost  items2_product  items2_cost 
 Dave        apple            120        orange           80     
 Nick     
 Jack        melon            100        berries         240

我尝试通过“select items::JSONB from sales”将项目的数据类型转换为 Json,但出现错误,类型“jsonb”不存在;

还有其他方法可以实现吗?

【问题讨论】:

如果您收到“type "jsonb" doesn't exist”,您使用的是不受支持的 Postgres 版本。但是转换为json 至少应该可以工作。 select version(); 向您展示了什么? PostgreSQL 8.0.2 on i686-pc-linux-gnu,由 GCC gcc (GCC) 3.4.2 20041017 (Red Hat 3.4.2-6.fc3)、Redshift 1.0.22169 编译跨度> 您使用的不是 PostgreSQL,而是 Amazon Redshift - 它们是两种截然不同的产品。 【参考方案1】:

Redshift 没有原生 json 数据类型,但它有 json 解析功能。您存储在“项目”列中的是文本,而不是 json。要从此 json 文本中提取元素,您可以使用 Redshift json 内置函数,您可以在此处阅读 - https://docs.aws.amazon.com/redshift/latest/dg/json-functions.html

所以要为每个人提取 item1 的产品名称,您可以:

select select json_extract_path_text(items, 'item1', 'product') as items1_product from <table>;

现在您的 json 格式看起来不正确,因为单词“apple”是一个字符串值,应该被引用。我希望这只是为您的问题编写示例时的疏忽。如果不是这种情况,并且您有一些 json 清理工作要做,那么您可以使用 is_valid_json() 函数来确保您的表 json 数据在尝试解析之前是正确的。

【讨论】:

以上是关于在 Redshift 中拆分一个 varchar 列的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Redshift 中拆分字符串并进行迭代

从redshift sql中的varchar中提取值

需要从源表中获取布尔类型列作为 varchar 并在 Amazon redshift 的目标表中存储为 varchar

Redshift - 将时区偏移量(Varchar)添加到时间戳列

Amazon Redshift - 表列声明为 varchar(max) 但强制为 varchar(255)

为啥 Redshift 在加入时会自动修剪 varchar 列?