核心一句话先记住:
GROUP BY 不会凭空把"线上订单号"变空。
真正把它变空的,是你拿去 GROUP BY 的那个"加工后的值"。
1. 拆解核心语句
sql
COALESCE(NULLIF(TRIM(CAST(`线上订单号` AS CHAR(255))), ''), '')
先把
线上订单号转成文本,再去掉前后空格;如果处理完是空字符串,就当成 NULL;最后如果是 NULL,就返回空字符串''
1.1 CAST(\线上订单号` AS CHAR(255))`
sql
CAST(`线上订单号` AS CHAR(255))
把 线上订单号 强制转换成字符类型。
为什么要转成字符
因为订单号在原表里可能不是纯文本,可能是:
数字
bigint
int
混合类型
但你后面想做:
去空格
判空
拼接
比较
这些操作通常对字符串更稳定,所以先统一转成文本。
什么时候用 CAST
你以后遇到这些情况就会用到:
数字转字符串
字符串转数字
时间转日期
不同字段类型不一致,先统一类型
sql
CAST(金额 AS DECIMAL(10,2))
CAST(日期字段 AS DATE)
CAST(订单号 AS CHAR(255))
CAST(转换/塑形):
- 含义: SQL 中的标准类型转换函数。就像是一个模具,把一种形态的东西压成另一种形态。
金额(目标字段):
- 含义: 这是你表里原本的列名。在数据库里,它可能一开始被错误地存成了字符串类型(比如
'100.5'),或者你为了后续计算,需要规范它的格式。
AS(作为):
- 含义: 语法连接词,告诉数据库:"把前面的东西,作为后面的类型处理"。
DECIMAL(精确小数类型):
- 含义: 这是这句代码的核心 。在 SQL 中,处理带小数的数字有
FLOAT(浮点数)和DECIMAL(定点数)。DECIMAL是会计专用类型,它保证数字绝对精确,不会出现丢失精度的四舍五入误差。
(10,2)(精度与标度):
10 (Precision / 精度): 代表这个数字的总长度最多是 10 位。
2 (Scale / 标度): 代表小数点后的位数固定是 2 位。
⚠️ 核心易错点: 这意味着小数点前的整数部分最多只有 8 位(10 - 2 = 8),而不是 10 位!这个字段能存的最大数字是
99999999.99(即 9999万左右)。
1.2 TRIM(...)
sql
TRIM(CAST(`线上订单号` AS CHAR(255)))
意思是:
去掉字符串前后两边的空格。
比如:
原值 TRIM 后 ' 12345 ''12345'' ABC ''ABC'' '''
为什么要去空格
因为数据库里经常会有脏数据,比如:
前面多了空格
后面多了空格
看起来有值,其实全是空格
如果不处理,后面判断可能不准。
例如:
sql
' ' != ''
看起来像空,但它其实不是空字符串。
所以先 TRIM,就能把这种"假空值"清洗掉。
什么时候用 TRIM
特别适合这些场景:
编码、订单号、手机号清洗
判断字段是不是空
join 前统一格式
去除脏数据空格
1.3 NULLIF(..., '')
sql
NULLIF(TRIM(CAST(`线上订单号` AS CHAR(255))), '')
这个函数你要重点理解。
NULLIF(a, b)的意思是:如果 a = b,就返回 NULL;如果 a ≠ b,就返回 a。
所以这里的意思是:
如果去掉空格后的订单号是空字符串
'',那就把它变成NULL
为什么要把空字符串变成 NULL
因为在很多 SQL 场景里:
真正的"无值"最好统一成 NULL。
这样方便:
统一判空
COALESCE补默认值避免空字符串和 NULL 混着用
什么时候用 NULLIF
非常适合这些场景:
-
把空字符串转成 NULL
-
避免除数为 0
-
清洗脏数据
比如还有一种经典写法:
sql
金额 / NULLIF(数量, 0)
意思是:
如果数量是 0,就返回 NULL,避免除 0 报错。