LEFT函数非SQL标准,MySQL/SQL Server支持LEFT(col,n),PostgreSQL(9.1+)和SQLite/Oracle需用substring或substr;对NULL输入返回NULL;WHERE中使用易致全表扫描,应优先用LIKE;长度超限时LEFT安全,负数长度行为因库而异。

LEFT 函数在不同数据库里的写法差异
LEFT 不是 SQL 标准函数,MySQL 和 SQL Server 支持 LEFT(),但 PostgreSQL、SQLite、Oracle 默认不认——它们用 substring() 或 substr()。别一写 LEFT(col, 3) 就跑,先看库型。
- MySQL / SQL Server:
LEFT(column_name, length)直接可用 - PostgreSQL:
substring(column_name from 1 for length)或left(column_name, length)(9.1+ 才支持) - SQLite:
substr(column_name, 1, length)(注意:起始位置是 1,不是 0) - Oracle:
substr(column_name, 1, length)
LEFT 返回 NULL 的常见原因
LEFT() 本身不会因参数为空报错,但它对 NULL 输入直接返回 NULL。如果你发现截取结果全空,大概率不是函数写错了,而是源字段本身就是 NULL 或空字符串。
- 检查原始数据:
SELECT column_name, LENGTH(column_name) FROM table WHERE ... - 安全写法加
COALESCE:LEFT(COALESCE(column_name, ''), 5) - 注意空格干扰:左侧带空格时,
LEFT(' abc', 3)得到的是' a',不是预期的'abc'
LEFT 在 WHERE 条件里用多了会拖慢查询
对字段用 LEFT(column, N) 做过滤,基本等于放弃索引——除非你建了函数索引(如 PostgreSQL 的 CREATE INDEX ON t ((LEFT(col, 3)))),否则每次都要全表扫描。
- 想查“前缀为 abc”的数据,优先用:
WHERE column_name LIKE 'abc%'(可走索引) - 只有当逻辑必须截取再比较时(比如取前 2 位做分组统计),才用
LEFT,且考虑是否能提前在应用层处理 - MySQL 8.0+ 支持函数索引,但
LEFT(col, 3)索引需显式创建,不会自动生效
LEFT 和 SUBSTRING 的边界行为区别
长度参数超长时,LEFT() 安全;SUBSTRING() 在部分数据库里可能报错或返回空,行为不统一。
-
LEFT('abc', 10)→ 永远返回'abc'(不报错) -
SUBSTRING('abc', 1, 10)在 MySQL 中也安全,但在旧版 SQL Server 可能截断或警告 - 负数长度:
LEFT('abc', -1)在 MySQL 中返回空字符串,在 SQL Server 中直接报错Argument data type int is invalid for argument 2 of left function
LEFT 还是 substr;别默认它能处理 NULL;WHERE 里慎用,尤其别拿它替代 LIKE;长度传参前最好校验下是不是正整数。

















