postgresql 从json数组中提取json值,并分组,汇总

postgresql  从json数组中提取json值,并分组,汇总

json数据 

{"os": "Android", "chn": "-1", "dan": 0, "sex": 0, "file": "lv_statistics", "time": "2017-01-23 16:47:54", "honor": 0, "chn_id": "-1", "is_pay": 0, "account": "-1", "role_id": -1, "battle_id": 1050, "game_time": 301, "role_name": "-1", "battle_name": "-1", "battle_type": 4, "lv_num_json": [{"lv": 8,"num": 1},{"lv": 9,"num": 10}]"}
	SELECT	cont->>'lv_num_json' FROM	log_info	WHERE	file = 'lv_statisticsx'
 查询结果:[{"lv": 8, "num": 1}, {"lv": 9, "num": 10}]

--例子 
select json_array_elements(lv_num_json)->'lv' lv,json_array_elements(lv_num_json)->'num' num   from (
   select '[{"lv": 8, "num": 1}, {"lv": 9, "num": 10}]'::json lv_num_json
)as t1
输出结果:
lv  num
---------------------
8    1
9    10


 -- json_array_elements :展开一个JSON数组的JSON值
SELECT	json_array_elements((cont->>'lv_num_json')::json)->'lv' lv,json_array_elements((cont->>'lv_num_json')::json)->'num' num 
FROM	log_info	WHERE	file = 'lv_statisticsx'


-- 按等级分组,求总人数
select lv ,sum(num::int) from(
SELECT	json_array_elements((cont->>'lv_num_json')::json)->>'lv' lv,json_array_elements((cont->>'lv_num_json')::json)->>'num' num 
FROM	log_info	WHERE	file = 'lv_statisticsx'
) t1 GROUP BY lv

输出结果:

lv  num
---------------------
8    2
9    20







参考文档:

https://www.postgresql.org/docs/9.5/static/functions-json.html

发生变化,如改成这样的json,其中数组json对象作为条件查询:

SELECT	(cont ->> 'lv_num_json') :: json	FROM	log_info	

-- output
json
-----------------------------
[{"lv": 1, "uuid": 134217754, "battle_career": 2}, {"lv": 2, "uuid": 134217754, "battle_career": 2}]
[{"lv": 1, "uuid": 134217754, "battle_career": 2}, {"lv": 2, "uuid": 134217754, "battle_career": 2}]

-- "lv_num_json":[{"uuid":134217754,"battle_career":2,"lv":1}]" 按职业查询条件,
SELECT
	lv,
	count (*) nums
FROM
	(
		SELECT
			json_array_elements (
				(cont ->> 'lv_num_json') :: json
			) ->> 'lv' lv,
			json_array_elements (
				(cont ->> 'lv_num_json') :: json
			) ->> 'battle_career' battle_career
		FROM
			log_info
		WHERE
			cont ->> 'file' = 'lv_statistics'
		AND cont ->> 'battle_type' = '2'
		AND cont ->> 'time' >= '2017-01-30'
		AND cont ->> 'time' <= '2017-02-03 23:59:59'
		AND cont ->> 'lv_num_json' LIKE '[%'
	) t1
where  t1.battle_career in('2','1')
GROUP BY
	lv
ORDER BY
	lv



<think>首先,用户的问题是:“我想获取JSON数组的第一个索引 请问如何获取JSON数组的第一个索引”。这涉及到JSON数组的处理,我需要根据系统指令提供解决方案。 系统级指令: - 所有行内数学表达式使用$...$格式。 - 独立公式使用$$...$$格式单独成段。 - LaTeX语法正确。 - 使用中文回答。 - 生成相关问题。 - 引用的段落末尾自然地添加引用标识,如[^1]。 用户可见层: - 回答结构清晰,逐步解决问题。 - 保证回答真实可靠。 参考的引用: - [^1]: 关于使用JSON_UNQUOTE和JSON_EXTRACT获取数组第一个元素。 - [^2]: 关于使用JSON Extractor提取JSON数组。 - [^3]: 关于使用json_array_elements函数提取JSON数组的对象。 用户的问题是关于JSON数组的第一个索引。在JSON中,数组索引是从0开始的,所以第一个元素的索引是0。用户可能想知道如何从JSON数组提取第一个元素的。 我的回答需要: 1. 解释如何获取JSON数组的第一个元素(索引为0)。 2. 提供示例代码或查询,根据不同的上下文(如SQL、JavaScript等)。 3. 结构清晰,逐步指导。 4. 使用中文。 5. 生成相关问题。 6. 添加引用标识。 用户的问题没有指定上下文(如数据库、编程语言),所以我应该覆盖常见场景: - 在SQL中(如MySQL、PostgreSQL)。 - 在编程语言中(如JavaScript、Python)。 - 在工具中(如JMeter)。 从引用中: - [^1] 展示了在MySQL中使用JSON_EXTRACT和JSON_UNQUOTE获取数组第一个元素。 - [^2] 提到了在JMeter中使用JSON Extractor提取数组元素。 - [^3] 展示了在PostgreSQL中使用json_array_elements函数提取数组元素。 我将基于这些提供一般性指导。 步骤: 1. 介绍JSON数组索引的概念。 2. 提供不同场景下的获取方法。 3. 给出示例。 4. 生成相关问题。 确保回答真实可靠:我将基于标准JSON处理实践。 最后,生成相关问题,如用户示例中所示。 草拟回答结构: - 开头解释问题。 - 分点说明不同方法: - 在SQL中(引用[^1]和[^3])。 - 在编程语言中。 - 在工具中(引用[^2])。 - 结尾总结。 - 添加相关问题。 使用LaTeX:用户问题中没有数学表达式,所以可能不需要,但如果有计算,就用上。这里可能不需要数学公式,除非解释索引。 引用标识:在引用段落末尾添加[^1]等。</think>### 如何获取JSON数组的第一个索引JSON中,数组的索引从0开始计数,因此“第一个索引”通常指索引位置0的元素。获取的方法取决于您使用的技术栈(如SQL数据库、编程语言或工具)。下面我将逐步说明常见场景下的实现方式,确保操作真实可靠。所有示例均基于标准JSON处理规范。 #### 1. **在SQL数据库中获取** - **MySQL**:使用`JSON_EXTRACT`函数(或简写`->`)提取索引0的元素,结合`JSON_UNQUOTE`移除引号(如果是字符串)。例如: ```sql -- 假设json_column是包含JSON数组的列,如["apple", "banana", "cherry"] SELECT JSON_UNQUOTE(JSON_EXTRACT(json_column, '$[0]')) AS first_element FROM my_table; ``` 这里`$[0]`表示数组的第一个索引位置[^1]。 - **PostgreSQL**:使用`json_array_elements`函数展开数组通过`ROW_NUMBER`过滤第一个元素: ```sql SELECT (elem->>'key') AS first_element FROM my_table, LATERAL ( SELECT elem, ROW_NUMBER() OVER () AS rn FROM json_array_elements(json_column) AS elem ) AS subquery WHERE subquery.rn = 1; -- 索引0对应行号1 ``` 此方法适用于复杂JSON对象提取[^3]。 #### 2. **在编程语言中获取** - **JavaScript**:直接通过索引0访问数组元素: ```javascript const jsonArray = JSON.parse('["apple", "banana", "cherry"]'); // 解析JSON字符串 const firstElement = jsonArray[0]; // 返回 "apple" ``` 如果JSON数据来自API响应,先解析再访问索引。 - **Python**:使用`json`库解析,然后索引获取: ```python import json json_str = '["apple", "banana", "cherry"]' json_array = json.loads(json_str) first_element = json_array[0] # 返回 "apple" ``` #### 3. **在工具中获取(如JMeter)** - 使用**JSON Extractor**组件: 1. 添加JSON Extractor到HTTP请求。 2. 设置`JSON Path Expressions`为`$[0]`(索引0)。 3. 在`Match No.`字段输入`1`(表示第一个匹配项)。 4. 结果存储在变量(如`first_element_1`)中,可直接引用[^2]。 #### 关键注意事项 - **索引从0开始**:JSON数组遵循零基索引,因此索引0总是第一个元素。 - **错误处理**:如果数组为空,访问索引0会报错(如SQL中的`NULL`或编程中的异常)。建议先检查数组长度。 - **性能**:在大型数组中,直接索引访问的时间复杂度为$O(1)$,效率最高。 通过以上方法,您可以安全地获取JSON数组的第一个索引。根据您的具体环境选择合适方案。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值