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"} ] } ] }
执行脚本
- 先把文本文件的键转换为jq可处理的JSON数组:
keys=$(jq -R . keys.txt | jq -s .)
- 遍历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
相关产品推荐
相关产品推荐

