可用版本: 开发版 (3.21) | 最新版 (3.20)

JSON_KEY_EXISTS

适用于 ✅ 开源版   ✅ 专业版   ✅ 企业版

JSON_KEY_EXISTS 函数是一个非标准的 JSON 函数,其灵感来源于 PostgreSQL 的 JSONB_EXISTS 函数或 ? 操作符,它可以用于检查 JSON 对象中是否存在某个键。

SELECT json_key_exists(json_object(
  KEY 'a' VALUE 1
), 'a')
create.select(jsonKeyExists(jsonObject(
          key("a").value(1)), "a"))
      .fetch();

结果如下

+-----------------+
| json_key_exists |
+-----------------+
| true            |
+-----------------+

这只是标准 SQL JSON_EXISTS 谓词的一个功能较弱的版本,JSON_EXISTS 谓词可以处理 JSON 路径,而不仅仅是键名。

方言支持

此示例使用 jOOQ

jsonKeyExists(jsonObject(key("a").value(1)), "a")

翻译成以下特定方言的表达式

Aurora Postgres, Postgres, YugabyteDB

(CAST(json_build_object('a', CAST(1 AS int)) AS jsonb) ?? 'a')

BigQuery

json_query(
  json_object('a', 1),
  ('$.' || 'a')
) IS NOT NULL

ClickHouse

JSONExtractRaw(
  toJSONString(map('a', 1)),
  'a'
) IS NOT NULL

CockroachDB

(json_build_object('a', CAST(1 AS int4)) ?? 'a')

DB2

coalesce(
  json_query(
    json_object(KEY 'a' VALUE 1),
    ('$.' || CAST('a' AS varchar(3998)))
  ),
  nvl2(
    json_query(
      json_object(KEY 'a' VALUE 1),
      ('$.' || CAST('a' AS varchar(3998))) EMPTY ARRAY ON EMPTY
    ),
    NULL,
    'null'
  )
) IS NOT NULL

DuckDB, SQLite

(json_object('a', 1)->'a') IS NOT NULL

MariaDB, MySQL

json_extract(
  json_object('a', 1),
  concat('$.', 'a')
) IS NOT NULL

Oracle

json_query(
  json_object(KEY 'a' VALUE 1),
  '$.a'
) IS NOT NULL

Snowflake

get(
  object_construct_keep_null('a', 1),
  'a'
) IS NOT NULL

Trino

json_extract(
  CAST(map_from_entries(ARRAY[row(
    'a',
    CAST(1 AS json)
  )]) AS json),
  ('$.' || 'a')
) IS NOT NULL

ASE, Access, Aurora MySQL, Databricks, Derby, Exasol, Firebird, H2, HSQLDB, Hana, Informix, MemSQL, Redshift, SQLDataWarehouse, SQLServer, Sybase, Teradata, Vertica

/* UNSUPPORTED */
使用 jOOQ 3.21 生成。早期 jOOQ 版本的支持可能有所不同。 在我们的网站上翻译您自己的 SQL

反馈

您对此页面有任何反馈吗? 我们很乐意听取您的意见!

The jOOQ Logo