# 2203B — sql_json_number_not_found

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

# 2203B

## 速览 {#at-a-glance}
jsonpath 一元算术操作符要求数值操作数，却收到了其他类型的项。这是一元操作符边界，与数值转换方法分开。

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

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

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

## 报文 {#messages}
固定的一元分支报告：

`operand of unary jsonpath operator %s is not a numeric value`

## 含义 {#meaning}
`executeUnaryArithmExpr` 遍历操作数序列并接受其中每个数值标量项，对每项应用一元函数。只有同时满足 `!found` 和 `!hasNext` 时才会跳过非数值项；这表示终止的存在性求值且不收集结果。其他情况下都会进入 2203B 检查条件，包括普通结果收集在终止步骤遇到非数值项时。lax 模式下执行器可能先解包数组。`.number()` 或 `.integer()` 等数值项方法使用 22036。

## 诊断 {#diagnosis}
查看一元操作符名称和它之前的完整项序列。检查哪些项是数值、lax 解包是否改变了序列，以及调用方是在收集结果还是只在终止步骤做存在性判断。不要把它解释成数值越界或数值转换方法失败。

## 处理 {#response}
约束路径使其得到预期的数值序列，规范化每个 JSON 值，或改用接受实际类型的操作。把终止的存在性/不收集结果优化作为单独的已知行为记录；普通结果收集仍要求每个被处理项都是数值。如果 ERROR 发生在显式事务中，应先 ROLLBACK 或回滚到既有保存点再重试；自动提交可重试修正后的动作。

## 版本 {#versions}
锁定目录从 12.0 起记录该条件；固定的一元算术分支来自 PostgreSQL 18.6。本页未声称有自然运行观察。

## 相关 {#related}
[`22036`](../22036/)、[`22038`](../22038/)、[`22012`](../22012/)

## 来源 {#sources}
完整的一元算术序列和非数值检查条件见 [`jsonpath_exec.c#L2158-2221`](https://github.com/postgres/postgres/blob/724edf9bde9d356724ad384a2e196edc3c9f80f7/src/backend/utils/adt/jsonpath_exec.c#L2158)。共享 strict/lax 与抛出/返回宏见 [`jsonpath_exec.c#L235-249`](https://github.com/postgres/postgres/blob/724edf9bde9d356724ad384a2e196edc3c9f80f7/src/backend/utils/adt/jsonpath_exec.c#L235)。结构化[证据记录](../../data/evidence/2203b.json)绑定操作符首要报文和终止路径边界；本页未运行自然案例。
