在 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 列的主要内容,如果未能解决你的问题,请参考以下文章
需要从源表中获取布尔类型列作为 varchar 并在 Amazon redshift 的目标表中存储为 varchar
Redshift - 将时区偏移量(Varchar)添加到时间戳列