doubao-seed-2-1-pro 在「PostgreSQL JSONB字段解析与聚合统计」的评测结果

这是该 AI 模型在此测试用例上的详细评测结果。

基本信息

  • 模型名称:doubao-seed-2-1-pro
  • 用例名称:PostgreSQL JSONB字段解析与聚合统计
  • 测试类型:文本生成
  • 评测维度:SQL 专家

系统提示词(System Prompt)

这是给 AI 模型的背景设定和角色指令:

你是一名资深的 PostgreSQL 数据库工程师。 回答要求: 1. 给出完整、可直接执行的 SQL 语句 2. 对关键语法和操作符进行简要注释 3. 说明 JSONB 操作符的含义 4. 最终 SQL 要格式整洁、易于阅读

用户提示词(User Prompt)

这是用户给 AI 模型的具体任务要求:

有一张 PostgreSQL 表,结构如下: ```sql CREATE TABLE app_logs ( id SERIAL PRIMARY KEY, created_at TIMESTAMPTZ NOT NULL, payload JSONB NOT NULL ); ``` 其中 `payload` 字段的示例数据如下: ```json { "level": "error", "error_code": "E1001", "message": "Connection timeout" } ``` 请写一条 SQL 查询,从 `payload` 字段中提取 `error_code` 的值,并只返回 `level` 为 `"error"` 的记录。 要求返回列:`id`、`created_at`、`error_code`(从 JSONB 中提取的文本值)。

任务要求

AI 模型需要满足以下要求:

  1. 正确使用 JSONB 操作符(如 `->>` 或 `->>`)提取 `error_code` 字段为文本类型
  2. 正确使用 WHERE 条件过滤 `payload->>'level' = 'error'` 的记录
  3. 返回列包含 `id`、`created_at` 以及提取后的 `error_code`
  4. SQL 语法正确,可在标准 PostgreSQL 环境下执行
  5. 对 JSONB 操作符的用途有简要说明

评测结果

综合得分

该模型在此用例的得分为:100.0 分(满分 100 分),已通过

基础难度评测结果

  • 得分:100.0 分
  • 通过状态:已通过

模型生成产物

以下是该模型针对此任务的实际生成内容:

--- ### 可直接执行的完整SQL ```sql SELECT id, created_at, -- 从JSONB顶层提取error_code字段,直接返回原生TEXT类型 payload ->> 'error_code' AS error_code FROM app_logs WHERE -- 精准筛选level字段值为"error"的日志记录 payload ->> 'level' = 'error'; ``` --- ### 关键语法与JSONB操作符说明 #### 1. 核心JSONB操作符详解 PostgreSQL 为JSONB类型提供了专用操作符,本次查询用到的是最常用的**顶层文本提取操作符`->>`**,易混操作符对比说明如下: | 操作符 | 返回类型 | 作用说明 | |--------|-----------|----------| | `->` | JSONB | 根据键名提取JSON字段值,结果仍为JSONB类型,适合继续嵌套提取、或与JSONB格式值做比对;如果提取字符串类型值,结果会携带JSON语法的双引号 | | `->>` | TEXT | 根据键名提取JSON字段值,**自动转换为PostgreSQL原生文本类型返回**:字符串值会自动去掉包裹的双引号、数字/布尔值会转为对应文本表示、键不存在/值为JSON null时返回SQL NULL,是提取文本值的标准写法 | | `#>>` | TEXT | 按路径提取嵌套JSON字段的文本值(比如提取`payload.detail.code`可简写为`payload #>> '{detail, code}'`),本次场景为顶层字段无需使用 | #### 2. 逻辑说明 - 筛选规则:`payload ->> 'level' = 'error'` 是严格等值匹配,仅当`payload`中存在`level`键、且值为JSON字符串类型、内容完全等于`error`时才会返回记录;键缺失、值类型不匹配(数字/布尔/对象/数组)、内容不匹配的记录都会被过滤 - 返回值规则:`error_code`通过`->>`直接提取为纯文本,不会携带JSON语法符号,无需额外类型转换;如果某条错误日志缺失`error_code`字段,对应列会返回NULL,不会触发语法错误 - 性能提示:如果表数据量较大,可以为筛选条件创建表达式索引`CREATE INDEX idx_app_logs_error_level ON app_logs ((payload ->> 'level'));` 大幅提升查询速度(本需求未要求索引,仅作扩展提示)

AI 评审点评

以下是 AI 评审对该模型输出的点评:

【GEMINI】模型提供的回答非常专业且全面。SQL 逻辑严谨,对 PostgreSQL JSONB 操作符的解释深入浅出,涵盖了类型差异、空值处理及性能优化建议,完全符合资深数据库工程师的专业定位。

进阶难度评测结果

  • 得分:100.0 分
  • 通过状态:已通过

模型生成产物

以下是该模型针对此任务的实际生成内容:

### 可直接执行的完整SQL语句 ```sql SELECT -- 【时间截断】将带时区的日志创建时间截断到小时精度,得到整点时间戳(TIMESTAMPTZ类型) date_trunc('hour', created_at) AS hour, -- 【JSONB提取】使用->>操作符从payload中提取error_code字段的文本值 payload->>'error_code' AS error_code, -- 【分组聚合】统计当前分组内的错误日志总条数 COUNT(*) AS error_count FROM app_logs WHERE -- 【前置过滤】仅保留日志级别为error的记录,提前缩小计算范围提升查询效率 -- 通过->>提取level字段的文本值,与常量'error'匹配 payload->>'level' = 'error' GROUP BY -- 分组维度1:截断后的整点小时(使用原始表达式保证兼容性) date_trunc('hour', created_at), -- 分组维度2:提取出的错误码 payload->>'error_code' ORDER BY -- 排序规则1:按小时从早到晚升序排列 hour ASC, -- 排序规则2:同小时内按错误出现次数从多到少降序排列 error_count DESC; ``` --- ### 关键语法与逻辑说明 #### 1. JSONB 核心操作符 | 操作符 | 作用说明 | |--------|----------| | `->>` | 文本提取操作符,左值为JSONB列、右值为键名,返回指定键对应的**SQL文本类型值**:- 自动将JSON中的字符串、数字、布尔值转换为原生文本格式- 若键不存在则返回`NULL`- 区别于`->`操作符(返回JSONB类型,字符串会保留双引号,无法直接和文本常量匹配) | > 示例:`payload->>'level'` 会从JSON中取出level字段的纯文本值,用于和`'error'`做等值判断。 #### 2. 时间处理函数 | 函数 | 作用说明 | |------|----------| | `date_trunc(unit, timestamptz_value)` | 时间截断函数,将输入时间截断到指定精度,低于该精度的部分重置为零值:- 此处`unit='hour'`表示截断到小时,分、秒、微秒置0,返回整点的带时区时间戳- 保留原字段的时区语义,不会出现时区转换偏差- 示例:`2024-06-20 15:42:33+08` 截断后为 `2024-06-20 15:00:00+08` | #### 3. 聚合与分组逻辑 - **过滤优先原则**:先通过`WHERE`条件筛除非error级日志,减少后续分组计算的数据量,相比先分组后过滤性能提升明显。 - **分组维度**:严格按照「整点小时+错误码」两个维度分组,保证每个分组唯一对应"某小时某类错误"的统计口径。 - **`COUNT(*)`聚合**:统计分组内的总行数(即错误出现次数),相比`COUNT(列名)`无需判断列非空,PostgreSQL中性能最优。 #### 4. 排序逻辑 - 第一排序键`hour ASC`:按时间从早到晚排列,直观展示错误随时间的变化趋势。 - 第二排序键`error_count DESC`:同小时内优先展示出现次数最多的高频错误,便于快速定位核心问题。 --- ### 大数据量场景优化提示 当日志量达到千万级以上时,可通过索引加速查询: 1. 适配当前SQL写法的表达式索引(针对level过滤优化): ```sql CREATE INDEX idx_app_logs_error_level ON app_logs ((payload->>'level')); ``` 2. 通用JSONB GIN索引(支持任意JSON字段过滤,需调整WHERE条件为包含查询): ```sql -- 创建GIN索引 CREATE INDEX idx_app_logs_payload_gin ON app_logs USING GIN (payload); -- 调整WHERE条件为包含匹配,可自动走索引 -- WHERE payload @> '{"level":"error"}'::jsonb ```

AI 评审点评

以下是 AI 评审对该模型输出的点评:

【GEMINI】候选答案表现优异。SQL 逻辑严谨、准确,文档说明详尽且深入浅出,涵盖了从基础实现到性能优化的全方位考量。完全符合资深数据库工程师的角色设定。

相关链接

您可以通过以下链接查看更多相关内容:

加载中...