【问题标题】:Equivalent Functions for JSON/B Operators in PostgresqlPostgresql 中 JSON/B 运算符的等效函数
【发布时间】:2020-01-08 04:44:30
【问题描述】:

我试图深入研究文档,但似乎找不到任何我想要的东西。 PostgreSQL 中的各种 JSON/B 运算符(->->>@>? 等)是否有等效功能?

编辑:澄清一下,我想知道是否可以让以下分组查询返回相同的结果:

SELECT '{"foo": "bar"}'::json->>'foo';                   -- 'bar'
SELECT json_get_value('{"foo": "bar"}'::json, 'foo');    -- 'bar'

SELECT '{"foo": "bar"}'::jsonb ? 'foo';                  -- t
SELECT jsonb_key_exists('{"foo": "bar"}'::jsonb, 'foo'); -- t

【问题讨论】:

  • 只是好奇,您将哪些东西与这些运算符进行比较
  • @AnthonySottile 我想一个例子可能是ST_GeomFromText(geom)geom::geometry。我知道他们不是直接平等的,而是相似的想法
  • 你到底想做什么?以及基于什么语言的运营商? JSON 本身没有这样的运算符。
  • @JorgeCampos 他们在Postgresql 中可用,我会用一个例子来更新我的问题
  • 我知道。那么问题来了,等价于什么? JSON 本身?

标签: json postgresql


【解决方案1】:

您可以使用系统目录来发现与每个运算符等效的功能。

select * from pg_catalog.pg_operator where oprname ='?';

这表明该函数名为“jsonb_exists”。有些运算符重载了,会给出多个函数,你必须查看参数类型来区分它们。

每个运营商都有一个“背后”的功能。该功能可能会或可能不会单独记录。

【讨论】:

  • 谢谢,这正是我想要的!
【解决方案2】:

AFAIK 有两个函数等效于 #>#>> 运算符。

这些是:

  • #>json_extract_path
  • #>>json_extract_path_text
  • ->> json_extract_path_text -- 致谢:@a_horse_with_no_name

Discover more in the docs

除此之外,您可以将 json 提取到表中并使用常规 SQL 查询获取所需的值,而不是使用 json_eachjson_each_text 的表。

与检查 JSON 中是否存在键相同的方法是使用 json_object_keys 并查询从中产生的表。

如果您需要用不同的语言/使用 ORM 来包装,那么您可以做的是将数据检索逻辑移动到 PL/SQL 过程中,然后执行它并从中获取准备好的数据。

显然,您也可以构建自己的函数来实现上述运算符的行为,但问题是:这真的值得吗?肯定会慢一些。

【讨论】:

  • “真的值得吗”如果我必须自己构建它们,我希望我可以使用现有的 ORM 而没有任何变通办法。谢谢!
  • 没错。我的意思是最终将操作员的行为包装在一个函数中,这会增加一些开销但仍然可以工作。您必须为每个运算符实现几个函数,然后执行这些函数。他们的主体仍将使用 JSON 运算符来检查是否存在或检索您需要的值,这样您就可以在 ORM 中使用这些函数。
  • 根据我的经验,除了简单地检查属性是否存在之外,我们还需要将逻辑包装在 PL/pgSQL 过程中,并在数据库端执行所有 JSON 方式以将其返回到应用程序。
  • @GammaGames:您也可以使用json_extract_path_text 代替->>
  • 将此用法包含在@a_horse_with_no_name 中。谢谢:-)
猜你喜欢
  • 2017-03-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-21
  • 1970-01-01
相关资源
最近更新 更多