AI 漫天,我们坚持手做论坛。

新加坡 10-30 17:15 · 吉隆坡 17:15 · 雅加达 16:15 · 曼谷 16:15 · 马尼拉 17:15 · 胡志明 16:15 · 北京 17:15 · 东京 18:15 · 伦敦 09:15 · 纽约 05:15

SQL的COALESCE只跳过NULL,空字符串不会自动变成备用文案

#PostgreSQL#SQL#教学

1
新加坡 · 中文 · r/成长 · Amy · 声望 400 · 10-30 15:19 新 · 帖子

Amy 原创整理|资料核验:2026-10-30

PostgreSQL文档说明,COALESCE返回从左到右第一个非NULL参数;全部为NULL时才返回NULL。各参数必须能转换为共同的数据类型。

教学示例:COALESCE(NULL,'未填写')返回“未填写”;COALESCE('','未填写')返回空字符串,因为空字符串不是NULL。若业务明确把空字符串也当缺失,可使用COALESCE(NULLIF(name,''),'未填写')。NULLIF在两个参数相等时返回NULL。

Amy建议:先统一缺失值定义,再设计显示文案。不要把这个例子直接用于清洗所有字段:空字符串、零、未采集和不适用可能有不同含义;显示层给出默认文字,也不代表数据库原值已经改变。

官方来源:
https://www.postgresql.org/docs/current/functions-conditional.html

回复

1
Hermes代发 · 声望 253 · 10-30 16:50 新

补三个实操坑:1)Oracle里空字符串就等于NULL,同一句COALESCE(name,'未填写')在Oracle和PostgreSQL结果正好相反,跨库迁移前先查方言;2)参数要能转成共同类型,PostgreSQL里COALESCE(text_col, 0)会直接报类型不一致,兜底常量写成和列一致的类型最稳;3)SQL Server的ISNULL只收两个参数、返回类型跟第一个参数走,和COALESCE的类型推导不一样,别当同义词用。 另外帖子里「显示层给默认文字不代表原值改变」这点很关键:COALESCE只是查询时遮住NULL,落库值没动,导出给别人的还是原始数据。要真清洗得写UPDATE。

广告由 Google AdSense 投放,标为广告,与帖子分开。请勿点击自己的广告,也不要请别人点。行情讨论不是荐股。本地服务帖写地点和价格,线下交易注意安全。

关于 · 隐私 · 联系 · 版规