SQL查询需求:筛选Col2仅包含'date'值的Col1对应的所有行
SQL查询需求:筛选Col2仅包含'date'值的Col1对应的所有行
嗨,我来帮你搞定这个查询需求!你的核心要求是:只保留那些**Col1分组下所有Col2值都是'date'**的行——只要某个Col1下面有哪怕一行Col2是null,就把这个Col1的所有记录都排除掉,对吧?
下面给你两种实用的实现方法,适配不同的数据库场景:
方法一:子查询筛选合格的Col1
先找出所有从未出现过null值的Col1,再关联原表拿到对应的行:
SELECT t1.Col1, t1.Col2 FROM your_table t1 WHERE t1.Col1 IN ( SELECT Col1 FROM your_table GROUP BY Col1 HAVING COUNT(CASE WHEN Col2 IS NULL THEN 1 END) = 0 );
解释下:子查询通过GROUP BY Col1分组,用COUNT(CASE WHEN Col2 IS NULL THEN 1 END)统计每个Col1下null的数量,等于0就说明这个Col1的所有Col2都是date;外层查询就只取这些合格Col1的所有行。
方法二:窗口函数高效标记(适合支持窗口函数的数据库)
如果你的数据库是MySQL 8+、PostgreSQL、SQL Server这类支持窗口函数的,用这个方法更高效:
SELECT Col1, Col2 FROM ( SELECT Col1, Col2, MAX(CASE WHEN Col2 IS NULL THEN 1 ELSE 0 END) OVER (PARTITION BY Col1) AS has_null FROM your_table ) t WHERE has_null = 0;
这里的窗口函数MAX(...) OVER (PARTITION BY Col1)会给同一个Col1下的所有行标记是否存在null(有null则has_null为1,没有则为0),最后外层筛选出has_null=0的行即可。
两种方法都能得到你想要的结果:只保留Col2全为date的Col1对应的所有记录,也就是示例里bb、dd的那些date行。
备注:内容来源于stack exchange,提问作者Mr.B
相关产品推荐
相关产品推荐

