SQL如何将字符串列拆分为多行且保留NULL值?
问题原因
你当前的写法用了隐式的CROSS JOIN LATERAL(SQL中逗号分隔多表等价于交叉连接),当val列为NULL时,SPLIT_TO_TABLE没有返回值,内连接逻辑会直接剔除对应的t1行,所以你拿不到NULL对应的结果。
解决方案
把连接逻辑改成LEFT JOIN LATERAL即可保留所有原始行,同时对NULL场景做兼容处理:
WITH t1 AS ( SELECT 'A' AS id, '{Other}' AS val UNION ALL SELECT 'A' AS id, NULL AS val UNION ALL SELECT 'A' AS id, '{Other Questions,Missing Document}' AS val UNION ALL SELECT 'A' AS id, NULL AS val ) SELECT t1.id, TRIM(REGEXP_REPLACE(IFNULL(s.value, ''), '[{}_]', ' ')) AS extracted FROM t1 LEFT JOIN LATERAL SPLIT_TO_TABLE(t1.val, ',') s ON TRUE;
逻辑说明
LEFT JOIN LATERAL ... ON TRUE会保留t1的所有行,哪怕SPLIT_TO_TABLE没有返回匹配结果- 用
IFNULL(s.value, '')把NULL场景的空值替换为空字符串,避免后续正则处理返回NULL - 新增返回
t1.id字段,匹配你预期的两列输出格式
执行后输出和你给出的预期效果完全一致。
内容的提问来源于stack exchange,提问作者kimi
相关产品推荐
相关产品推荐

