如何在BigQuery中检查表是否含空值?请验证我的SQL写法正确性
你的BigQuery空值统计代码:可行但不够可靠
嘿,我来帮你分析下这段代码的问题~
首先,你的代码能运行并得到一个数值结果,但它的逻辑存在明显缺陷,不是检查空值的可靠方式:
问题出在哪?
- 误判字符串"null"为NULL值:如果某个字段的实际值是字符串
"null"(比如SELECT "null" name, "abc" adrs),你的正则表达式会把它识别成空值,但实际上这只是一个普通字符串,不是SQL里的NULL,会导致统计结果错误。 - 依赖JSON序列化的格式:
to_json_string的输出格式虽然稳定,但如果字段名包含特殊字符(比如空格、引号),JSON的结构会变化,你的正则null[,}]可能无法准确匹配,进而漏统计或误统计。
更可靠的替代方案
根据你的需求,这里有两种更稳妥的方法:
方案1:逐个字段检查(适合字段少的表)
直接对每个字段用IS NULL判断,然后求和,逻辑清晰且准确:
#standardSQL WITH table1 AS( SELECT "somename" name,"someaddress" as adrs UNION ALL SELECT null name,null UNION ALL SELECT null name,null ) SELECT SUM(IF(name IS NULL, 1, 0)) + SUM(IF(adrs IS NULL, 1, 0)) AS no_of_nulls FROM table1
方案2:动态检查所有字段(适合字段多的表)
如果表的字段很多,手动写每个字段太麻烦,可以用INFORMATION_SCHEMA动态生成检查逻辑:
#standardSQL DECLARE columns_to_check ARRAY<STRING>; SET columns_to_check = ( SELECT ARRAY_AGG(column_name) FROM `your-project.your-dataset.INFORMATION_SCHEMA.COLUMNS` WHERE table_name = 'table1' ); EXECUTE IMMEDIATE ''' WITH table1 AS( SELECT "somename" name,"someaddress" as adrs UNION ALL SELECT null name,null UNION ALL SELECT null name,null ) SELECT SUM(''' || STRING_AGG('IF(' || column_name || ' IS NULL, 1, 0)', ' + ') || ''') AS no_of_nulls FROM table1 '''
总结
你的写法能得到结果,但不建议用于正式场景,容易出现统计错误。优先用上面两种基于IS NULL原生判断的方法,更准确也更易维护。
内容的提问来源于stack exchange,提问作者user475043
相关产品推荐
相关产品推荐

