【问题标题】:ERROR: function regexp_matches(jsonb, unknown) does not exist in Tableau but works elsewhere错误:函数 regexp_matches(jsonb, unknown) 在 Tableau 中不存在,但在其他地方有效
【发布时间】:2019-05-17 09:28:30
【问题描述】:

我有一个名为“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 中使用正则表达式函数烘焙的馅饼的数量。具体来说,这个:

REGEXP_EXTRACT([Bakery Activity], '"numOfPiesBaked":"?([^\n,}]*)')

但是,当我尝试将此计算字段放入我的文本表时,我收到一条错误消息:

错误:函数 regexp_matches(jsonb, unknown) 不存在;

执行查询时出错

值得注意的是,我的数据源是 PostgreSQL,Tableau 正则表达式函数支持;并非我的所有条目都包含numOfPiesBaked;当我在模拟器中运行它时,我得到了正确的提取(实际上,我得到了"numOfPiesBaked": 1",但删除字段名称是另一个问题)。

什么可能导致这个错误?

【问题讨论】:

  • 您使用的是REGEXP_EXTRACT...还是REGEXP_MATCHES?请发布您的整个查询。
  • @GMB 我正在使用 REGEXP_EXTRACT,但错误文本指的是 regexp_matches。我发布的公式是我的整个计算字段
  • 尝试将::text 添加到第二个参数。
  • @GordonLinoff 工作完美,谢谢!
  • @yoni:我猜你的意思是投射 first 参数?

标签: sql regex postgresql tableau-api


【解决方案1】:

简而言之:错误的数据类型、错误的功能、错误的方法。

REGEXP_EXTRACT 显然是一个abstraction layer of your client (Tableau),对于 Postgres,它被翻译成regexp_matches()。但该函数需要text 输入。由于jsonb -> text 没有赋值转换(有充分的理由),因此您必须添加显式转换才能使其工作,例如:

SELECT regexp_matches("Bakery Activity"::text, '"numOfPiesBaked":"?([^\n,}]*)')

(第二个参数可以是无类型的字符串字面量,Postgres函数类型解析可以延迟合适的数据类型text。)

现代版本的 Postgres 也有 regexp_match() 返回单行(与 regexp_matches 不同),这似乎是更好的翻译

但正则表达式是错误的方法
使用简单的json/jsonb operator ->>

SELECT "Bakery Activity"->>'numOfPiesBaked';

在您的示例中返回 '1'
如果你知道这个值是一个有效的整数,你可以马上转换它:

SELECT ("Bakery Activity"->>'numOfPiesBaked')::int;

【讨论】:

  • 我不能直接在 Tabelau 计算字段中使用 use json 运算符(尽管它在查询中非常有用),但是将 json 转换为文本并运行 regexp-extract 就像一个魅力。谢谢!!
【解决方案2】:

我发现了一种在 Tableau 中处理 JSONB 数据的更简单方法。 首先,从 JSONB 字段中创建一个计算字段,并使用str([FIELD_name]) 命令将该字段转换为字符串。 然后,在计算字段上,创建另一个计算字段并使用函数:

REGEXP_EXTRACT([String_Field_Name], '"Key_to_be_extracted":"?([^\n,}]*)')

所需的键值对将形成第二个计算字段。

【讨论】:

    猜你喜欢
    • 2017-04-05
    • 1970-01-01
    • 1970-01-01
    • 2022-06-10
    • 2017-05-23
    • 2011-03-21
    • 1970-01-01
    • 1970-01-01
    • 2017-03-18
    相关资源
    最近更新 更多