You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

jq使用变量索引数组报错问题及基于JSON生成SQL插入语句需求

问题原因与解决方法

报错原因

你用--arg counter $i传递的变量是字符串类型,但jq中数组的索引必须是数字。比如你传入的"1"是字符串,不是数字1,用它去索引UnitTypes数组就会触发"Cannot index array with string"错误。

解决方法

有两种方式可以修复这个问题:

方法1:用--argjson传递数字类型参数

--argjson会把传入的参数当作JSON值解析,直接转成数字类型,不需要额外转换:

i=1
jq -r --argjson counter $i '.value[].UnitTypes[$counter]|to_entries[] | "\(.key) \(.value)"' test.json

方法2:在jq内将字符串转为数字

用tonumber函数把$counter字符串转成数字后再索引数组:

i=1
jq -r --arg counter $i '.value[].UnitTypes[$counter|tonumber]|to_entries[] | "\(.key) \(.value)"' test.json

针对生成SQL插入语句的完整方案

结合你的核心需求——根据文本文件的指定键生成SQL插入语句,这里提供一套完整的处理流程:

假设你的文本文件keys.txt内容(每行一个需要的键):

id
name
price

你的test.json示例结构:

{
  "value": [
    {
      "UnitTypes": [
        {"id": 1, "name": "TypeA", "price": 100, "extra": "ignore"},
        {"id": 2, "name": "TypeB", "price": 200, "extra": "ignore"}
      ]
    }
  ]
}

执行脚本

  1. 先把文本文件的键转换为jq可处理的JSON数组:
keys=$(jq -R . keys.txt | jq -s .)
  1. 遍历JSON记录,生成SQL插入语句:
jq -r --argjson keys "$keys" '
  .value[].UnitTypes[] |
  # 提取指定键的键值对
  [$keys[] as $k | {key: $k, value: .[$k]}] |
  # 过滤掉不存在的键(可选,避免无值字段)
  map(select(.value != null)) |
  # 拼接字段列表
  (map(.key) | join(", ")) as $cols |
  # 拼接值列表(字符串加单引号,数字直接转文本)
  (map(.value | if type == "string" then "\'\(.)\'" else tostring end) | join(", ")) as $vals |
  "INSERT INTO sometable ($cols) VALUES ($vals);"
' test.json

输出结果

执行后会生成标准的SQL语句:

INSERT INTO sometable (id, name, price) VALUES (1, 'TypeA', 100);
INSERT INTO sometable (id, name, price) VALUES (2, 'TypeB', 200);

内容的提问来源于stack exchange,提问作者Tahir Khalil

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 01:20:34