BigQuery批量更新多行异常:PRIORITY被设为NULL的语法排查
在BigQuery中批量更新时PRIORITY字段被设为NULL的问题分析与解决
你的SQL语句在BigQuery中执行后出现PRIORITY被设为NULL的原因是CASE表达式缺少ELSE分支:
- 当某行数据不满足CASE里的任何WHEN条件时,CASE会返回NULL,而你的UPDATE语句会把这些行的PRIORITY直接覆盖为NULL。
- 你在MySQL中执行正常,大概率是因为当时所有数据都符合CASE中的某个条件,没有触发返回NULL的情况,并非MySQL与BigQuery在此语法上有本质差异。
要解决这个问题,只需给CASE添加ELSE分支,指定不满足条件时保留PRIORITY的原有值:
UPDATE griffinDataset SET PRIORITY = ( CASE WHEN SDC_LOCATIONID = 5920 THEN 1 WHEN SDC_LOCATIONID = 5965 AND DFC_LOCATIONID = 5882 THEN 2 WHEN SDC_LOCATIONID = 5362 AND DFC_LOCATIONID = 5882 THEN 3 WHEN SDC_LOCATIONID = 5852 AND DFC_LOCATIONID = 5882 THEN 4 ELSE PRIORITY -- 保留原字段值 END ) WHERE 1=1;
另外,执行UPDATE前可以先通过SELECT语句验证CASE的返回结果,确认不会出现意外的NULL:
SELECT PRIORITY AS original_priority, CASE WHEN SDC_LOCATIONID = 5920 THEN 1 WHEN SDC_LOCATIONID = 5965 AND DFC_LOCATIONID = 5882 THEN 2 WHEN SDC_LOCATIONID = 5362 AND DFC_LOCATIONID = 5882 THEN 3 WHEN SDC_LOCATIONID = 5852 AND DFC_LOCATIONID = 5882 THEN 4 ELSE PRIORITY END AS new_priority FROM griffinDataset;
内容的提问来源于stack exchange,提问作者Griffin
相关产品推荐
相关产品推荐

