如何在SQL中访问<bigint>数组类型列并实现指定取值逻辑
需求说明
需要访问存储为<bigint>数组类型的abc列,实现以下逻辑:
- 当数组中包含负数时,返回
pqr列对应位置的前一个字母 - 无负数时返回
pqr列最后一个字母
示例数据如下:
| abc | pqr | 预期返回(xyz) |
|---|---|---|
| [30,10,40,20] | A > B > C | C |
| [10,20,300,40,-2] | S > V > Z > U | Z |
| [10,200,10,-5] | T > F > S | F |
| [80,20,700,40] | H > C > D | D |
实现方案(以PostgreSQL为例)
核心思路:
- 先判断
abc数组中是否存在小于0的元素 - 存在负数时,定位第一个负数的位置,按
>拆分pqr字符串后取对应偏移位的字母,去除前后空格 - 不存在负数时,直接取
pqr拆分后的最后一个字母,去除前后空格
对应SQL代码:
SELECT TRIM( CASE WHEN EXISTS (SELECT 1 FROM unnest(abc) AS num WHERE num < 0) THEN split_part( pqr, '>', ( SELECT idx - 2 FROM unnest(abc) WITH ORDINALITY AS t(num, idx) WHERE num < 0 ORDER BY idx LIMIT 1 ) ) ELSE split_part(pqr, '>', array_length(string_to_array(pqr, '>'), 1)) END ) AS xyz FROM your_table_name;
逻辑校验
用示例数据运行上述代码,返回结果和预期完全匹配:
- 第一行无负数,取
A > B > C最后一位C - 第二行第一个负数在数组第5位,取拆分后第3位
Z - 第三行第一个负数在数组第4位,取拆分后第2位
F - 第四行无负数,取
H > C > D最后一位D
注:如果使用其他SQL引擎(如Hive、ClickHouse、Spark SQL),只需要替换对应的数组遍历、字符串拆分函数即可,核心逻辑不变。
内容的提问来源于stack exchange,提问作者yogesh
相关产品推荐
相关产品推荐

