我有一个名为"Bakery Activity“的专栏,其值都是JSON,如下所示:
{"flavors": [
{"d4js95-1cc5-4asn-asb48-1a781aa83": "chocolate"},
{"dc45n-jnsa9i-83ysg-81d4d7fae": "peanutButter"}],
"degreesToCook": 375,
"ingredients": {
"d4js95-1cc5-4asn-asb48-1a781aa83": [
"1nemw49-b9s88e-4750-bty0-bei8smr1eb",
"98h9nd8-3mo3-baef-2fe682n48d29"]
},
"numOfPiesBaked": 1,
"numberOfSlicesCreated": 6
}我正在尝试提取在Tableau使用regex函数烤的馅饼的数量。具体而言,这一项:
REGEXP_EXTRACT([Bakery Activity], '"numOfPiesBaked":"?([^\n,}]*)')但是,当我试图将这个计算出的字段放入我的文本表时,我会看到一个错误:
错误:函数regexp_matches(jsonb,未知)不存在; 执行查询时出错
值得注意的是,我的数据源是Tableau regex函数支持的PostgreSQL;并不是我所有的条目都有numOfPiesBaked;当我在模拟器中运行这个条目时,我得到了正确的提取(实际上,我得到了"numOfPiesBaked": 1",但是在下一次删除字段名是个问题)。
是什么导致了这个错误?
发布于 2018-12-17 03:33:21
简而言之:错误的数据类型,错误的函数,错误的方法。
REGEXP_EXTRACT显然是一个客户的抽象层(Tableau),它被翻译成用于Postgres的regexp_matches()。但该函数需要text输入。由于jsonb -> text没有赋值强制转换(出于很好的理由),您必须添加显式强制转换才能使其工作,如下所示:
SELECT regexp_matches("Bakery Activity"::text, '"numOfPiesBaked":"?([^\n,}]*)')(第二个参数可以是非类型字符串文本,Postgres函数类型解析可以推迟合适的数据类型text。)
现代版本的Postgres还让regexp_match()返回一行(与regexp_matches不同),这看起来像是更好的翻译。
但是正则表达式是错误的方法,首先是。
使用简单的->>
SELECT "Bakery Activity"->>'numOfPiesBaked';在示例中返回'1'。
如果您知道这个值是一个有效的整数,您可以立即转换它:
SELECT ("Bakery Activity"->>'numOfPiesBaked')::int;发布于 2020-03-04 19:31:17
我在Tableau中找到了一种更简单的处理JSONB数据的方法。首先,从JSONB字段生成一个计算字段,并使用str([FIELD_name])命令将字段转换为字符串。然后,在计算字段上,进行另一个计算字段并使用函数:
REGEXP_EXTRACT([String_Field_Name], '"Key_to_be_extracted":"?([^\n,}]*)')所需的键值对将形成第二个计算字段。
https://stackoverflow.com/questions/53808020
复制相似问题