至少N个非空值的SQL等价表达式

编程语言 2026-07-09

可以处理空值操作数的表达式

这一类表达式旨在处理NULL值。表达式的结果取决于具体的表达式。

  • COALESCE
  • ...
  • ATLEASTNNONNULLS

nullExpressions.scala

  • 当且仅当至少有 n 个非空且非NaN的值时,该谓词将被评估为真。

示例数据:

CREATE OR REPLACE TABLE tab 
AS
SELECT 1 AS id, 'a' AS col1, CURRENT_DATE() AS col2, 42 AS col3,
       3.14::FLOAT AS col4, 'a'::VARIANT AS col5
UNION SELECT 2, 'b', NULL, NULL, 'NaN'::FLOAT, NULL
UNION SELECT 3, NULL, NULL, NULL, NULL, NULL 
UNION SELECT 4, '', NULL, 0, NULL, NULL;

SELECT * FROM tab;
编号 列1 列2 列3 列4 列5
1 a 2026-05-15 42 3.14 "a"
2 b null null NaN null
3 null null null null null
4 "" null 0 null null

ATLEASTNNONNULLS(2, col1, col2, col3, col4, col5) 对于行1 和4 应返回true。

解决方案

可以使用Snowflake的内置数组函数来实现它:

通常来说:

AtLeastNNonNulls(n: Int, col1, col2, ...) <~> ARRAY_SIZE(ARRAY_REMOVE(ARRAY_CONSTRUCT_COMPACT(col1, col2, ...),'NaN'::FLOAT)) >= n


除了 id 之外的所有列:

SELECT *, 
 ARRAY_SIZE(ARRAY_REMOVE(ARRAY_CONSTRUCT_COMPACT(* EXCLUDE(id)), 'NaN'::FLOAT))>=2 
 AS AtLeastNNonNulls
FROM tab
ORDER BY id;
/*
| ID | COL1 | COL2       | COL3 | COL4 | COL5 | ATLEASTNNONNULLS |
|----|------|------------|------|------|------|------------------|
| 1  | a    | 2026-05-15 | 42   | 3.14 | "a"  | TRUE             |
| 2  | b    | null       | null | NaN  | null | FALSE            |
| 3  | null | null       | null | null | null | FALSE            |
| 4  | ""   | null       | 0    | null | null | TRUE             |
*/

Output

站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章