在H2数据库查询中正确使用JSON列上的字段引用?

问题描述 投票:0回答:1

H2 没有像

JSON_VALUE(my_json, '$.myFieldName')
这样的 JSON 提取功能(例如 MySQL)。然而,“字段参考”的 H2 语法参考 指出:

( expression ) . fieldName

从行值或 JSON 值返回字段值。如果值为 null 或在 JSON 中找不到具有指定名称的字段,则返回 NULL。如果左侧的表达式是标识符(列名),则必须将其括在括号中,否则不需要。

(我的重点)

  1. 我有一个 H2 数据库,版本为 2.2.220(撰写本文时最新版本为 2023-09-17 的 2.2.224)。
  2. 我对一般 SQL(Oracle、MySQL、PostgreSQL 等)相当熟悉,但对 H2 细节还是很陌生
  3. 我的表格看起来像这样(简化且名称混淆):
  4. create table my_table ( id int generated by default as identity, my_json JSON null default null, );
    
    
  5. 插入此表的数据示例:
  6. insert into my_table (my_json) values ('{ "myFieldName": "foo bar" }');
    
    
  7. 我的查询:
  8. select id, my_json, (my_json).myFieldName as baz from my_table;
    
    
  9. 结果:我只得到
  10. NULL
     别名返回的 
    baz
     值 - 所有其他值均符合预期。我确实
    没有使用此语法遇到任何错误。但是,我也没有得到想要的结果foo bar

这可以按照我的意图使用(从 JSON 对象中提取字段)吗?我是否正确使用了它?如果没有的话我该如何使用?

相关

问题

H2数据库中的JSON_VALUE用法解决了同样的问题;回答者提出了建议

    自定义函数,或者
  1. 使用正则表达式。
我不想经历创建自定义函数和导入第三方库的复杂性,因为该数据库仅用于本地开发(项目团队的决定......),而部署时使用另一种方言的适当数据库引擎,所以不看(1)。

我已经能够将正则表达式方法的一些改编与

REGEXP_SUBSTR()

一起使用,但这留下了笨拙的代码(毕竟涉及正则表达式),我想知道更简单的替代方案。在我看来,H2 提供了创建 JSON 对象和数组的函数,但也不使用它们(除了上述内容,据我所知),这确实很可疑。

sql json h2
1个回答
0
投票
    您需要在此处使用
  1. JSON 文字
insert into my_table (my_json) values (JSON '{ "myFieldName": "foo bar" }');
尝试将字符串文字插入到 H2 中的 JSON 列中会创建一个 JSON 字符串值。

    您还需要引用 JSON 对象字段的名称:
select id, my_json, (my_json)."myFieldName" as baz from my_table;
未加引号的标识符默认转换为大写。

© www.soinside.com 2019 - 2024. All rights reserved.