IMPALA复杂类型:如何筛选content列非空数组的数据行
解决方案:筛选ArrayList类型列包含有效值的行
我明白你的问题啦——你想从表中找出content列里有实际有效数据(不是空列表也不是null)的行,但原来的is not null判断不管用,因为空的ArrayList(比如[])本身并不等于null,所以会被误捞出来。下面根据不同的数据库场景给你具体的解决办法:
1. 如果你用的是PostgreSQL
场景A:content是JSONB类型
PostgreSQL提供了专门的JSON函数来处理这类场景,我们可以用jsonb_array_length()来判断数组的长度:
SELECT * FROM t WHERE t.content IS NOT NULL AND jsonb_array_length(t.content) > 0;
场景B:content是原生ARRAY类型
用array_length()函数,注意第二个参数要指定维度(这里是1维数组):
SELECT * FROM t WHERE t.content IS NOT NULL AND array_length(t.content, 1) > 0;
2. 如果你用的是MySQL
MySQL的JSON类型可以用JSON_LENGTH()函数来判断数组元素数量:
SELECT * FROM t WHERE t.content IS NOT NULL AND JSON_LENGTH(t.content) > 0;
3. 如果是通过ORM(比如Hibernate)操作Java实体类
如果你的content字段映射的是Java的ArrayList,可以在HQL里直接用size()方法判断:
SELECT t FROM YourEntity t WHERE t.content IS NOT NULL AND size(t.content) > 0;
为什么原来的语句无效?
你之前写的select * from t, t.content where t.content is not null有两个问题:
- 首先,
t.content在FROM子句里会把数组拆成行(相当于交叉连接),这不是你要的筛选逻辑; - 其次,
is not null只能排除content为null的行,但*空的ArrayList([])*本身是一个有效的非null对象,所以会被保留下来,而我们需要的是包含至少一个元素的列表。
内容的提问来源于stack exchange,提问作者user3651247
相关产品推荐
相关产品推荐

