PostgreSQL中如何对比二维数组列与其他列并生成布尔值?
解决方案
方法:使用unnest结合EXISTS子查询
你可以通过unnest将二维数组dates_array展开为行记录,再用EXISTS子查询判断是否存在满足条件的子数组。以下是完整SQL语句:
SELECT cid, mid, date_start, date_end, dates_array, -- 检查是否存在满足条件的子数组 EXISTS ( SELECT 1 FROM unnest(dates_array) AS sub_dates(arr_start, arr_end) WHERE date_start > arr_start AND date_end < arr_end ) AS is_contained FROM your_table;
逻辑说明
unnest(dates_array):将每行的二维日期数组拆分为多行,每行对应一个子数组的两个日期(arr_start为子数组的起始日期,arr_end为结束日期)。EXISTS子查询:只要找到任意一个满足date_start > arr_start AND date_end < arr_end的子数组,就返回true,否则返回false。- 最终新增的
is_contained列就是你需要的布尔值结果。
针对示例数据的结果
按照你的条件(严格大于/小于),示例中所有行的is_contained都会是false,因为没有任何一行的日期区间被dates_array里的其他子数组完全包含(所有子数组要么和当前行区间完全重合,要么是前后衔接的区间)。如果需要调整判断逻辑(比如允许等于),只需修改WHERE子句的运算符(例如>=或<=)即可。
内容的提问来源于stack exchange,提问作者nakkhatra-opti
相关产品推荐
相关产品推荐

