# 22036 — non_numeric_sql_json_item

> PostgreSQL SQLSTATE 22036 的来源与诊断参考。
---

# 22036

## 速览 {#at-a-glance}
JSON 路径项方法收到的值不满足数值或转换约束。固定路径覆盖 `.number()`、`.decimal()`、`.integer()`、`.bigint()`、`.double()`、`.boolean()`、`.abs()`、`.floor()`、`.ceiling()`，以及 `.string()` 的相应类型检查。

<!-- BEGIN SQLSTATE FACTS: generated by scripts/generate.py; do not edit -->

| 字段 | 值 |
| --- | --- |
| SQLSTATE | `22036` |
| 条件名 | `non_numeric_sql_json_item` |
| 状态 | `有效` |
| 已知存在于 | `12.0` |
| 锁定快照 | `12.22, 13.23, 14.24, 15.19, 16.15, 17.11, 18.6, 19beta3` |
| 宏 | `ERRCODE_NON_NUMERIC_SQL_JSON_ITEM` |
| 别名 | `—` |

<!-- source facts: data/errcodes/22036.json -->
<!-- END SQLSTATE FACTS -->

## 报文 {#messages}
固定 jsonpath 方法的代表性首要报文如下：

| 触发条件 | 首要报文 |
| --- | --- |
| `.abs()`、`.floor()` 或 `.ceiling()` 收到非数值项 | `jsonpath item method .%s() can only be applied to a numeric value` |
| 转换方法收到的既不是字符串也不是数值项 | `jsonpath item method .%s() can only be applied to a string or numeric value` |
| `.boolean()` 收到不支持的项 | `jsonpath item method .%s() can only be applied to a boolean, string, or numeric value` |
| 字符串或数值不能转换为目标类型 | `argument "%s" of jsonpath item method .%s() is invalid for type %s` |
| 数值转换得到 NaN 或 Infinity | `NaN or Infinity is not allowed for jsonpath item method .%s()` |
| `.string()` 收到不支持的项 | `jsonpath item method .%s() can only be applied to a boolean, string, numeric, or datetime value` |

## 含义 {#meaning}
jsonpath 执行器会按输入类型分派各项方法。`.integer()`、`.bigint()`、`.double()` 以及 `.number()`/`.decimal()` 处理字符串输入时，会使用目标输入例程或数值解析，并通过 `ErrorSaveContext` 或显式错误标志记录失败。已有数值项走各自分支：`.number()` 可直接保留数值，`.integer()` 和 `.bigint()` 使用 `numeric_int4_opt_error`/`numeric_int8_opt_error`，`.decimal()` 再应用精度/小数位 typmod。`.boolean()` 直接接受布尔值，用 `int4in` 转换数值，用 `parse_bool` 解析字符串；`.abs()`、`.floor()` 和 `.ceiling()` 要求数值标量。数值和 double 路径拒绝 NaN 或 Infinity。`.string()` 的约束更宽，可接受布尔、字符串、数值或日期时间项；只有路径模式允许时才会解包数组。

## 诊断 {#diagnosis}
查看首要报文中的方法名、项类型和值。区分字符串解析和已有数值项：`.number()` 可直接处理已有数值，`.integer()`/`.bigint()` 做数值范围检查，`.decimal()` 可能应用精度/小数位 typmod，`.boolean()` 有直接、数值和 `parse_bool` 分支。对象、数组或不支持的项属于类型问题。若方法拒绝非有限数值，应在调用前移除或拦截它。不要把 `make_numeric_typmod_safe` 的所有底层精度/小数位诊断都归为 22036，只保留已展示的 jsonpath 报错分支。不要把本码与一元算术操作数检查条件 2203B，或 JSON 路径日期时间方法 22031 混淆。

## 处理 {#response}
修改路径以选中预期标量，在转换前规范化文档，或改用符合该值输入约束的方法。若源数据可能变化，应在调用方法前验证数值文本和有限性。如果 ERROR 发生在显式事务中，应先 ROLLBACK 或回滚到既有保存点再重试；自动提交可重试修正后的动作。

## 版本 {#versions}
锁定目录从 12.0 起记录该条件；固定的转换和项方法路径来自 PostgreSQL 18.6。本页未声称有自然运行观察。

## 相关 {#related}
[`2203B`](../2203b/)、[`22031`](../22031/)、[`22038`](../22038/)

## 来源 {#sources}
数值项方法检查条件见 [`jsonpath_exec.c#L1129-1588`](https://github.com/postgres/postgres/blob/724edf9bde9d356724ad384a2e196edc3c9f80f7/src/backend/utils/adt/jsonpath_exec.c#L1129)，`.string()` 类型约束见 [`#L1592-1647`](https://github.com/postgres/postgres/blob/724edf9bde9d356724ad384a2e196edc3c9f80f7/src/backend/utils/adt/jsonpath_exec.c#L1592)，只接受数值的方法见 [`#L2280-2310`](https://github.com/postgres/postgres/blob/724edf9bde9d356724ad384a2e196edc3c9f80f7/src/backend/utils/adt/jsonpath_exec.c#L2280)。strict/lax 与抛出/返回宏见 [`#L235-249`](https://github.com/postgres/postgres/blob/724edf9bde9d356724ad384a2e196edc3c9f80f7/src/backend/utils/adt/jsonpath_exec.c#L235)。结构化[证据记录](../../data/evidence/22036.json)绑定这些检查条件和报文；本页未运行自然案例。
