至少N个非空值的SQL等价表达式
这一类表达式旨在处理NULL值。表达式的结果取决于具体的表达式。
- COALESCE
- ...
- ATLEASTNNONNULLS
- 当且仅当至少有
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的内置数组函数来实现它:
- ARRAY_CONSTRUCT_COMPACT
从零个、一个或多个输入构造的数组;构造的数组会省略任何NULL输入值。
- ARRAY_REMOVE
- ARRAY_SIZE
通常来说:
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 |
*/

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