绝大多数主流数据库支持SUBSTRING,MySQL和Oracle默认支持SUBSTR,SQL Server仅支持SUBSTRING,PostgreSQL两者皆可;起始位置从1开始,负数索引在MySQL/Oracle中支持(从末尾倒数),SQL Server不支持,且WHERE中使用会失效索引。
SQL里SUBSTRING和SUBSTR到底能不能混用
绝大多数主流数据库(PostgreSQL、MySQL 5.7+、SQL Server、Oracle)都支持
,但是否支持
取决于具体方言——MySQL 和 Oracle 默认认
,而 SQL Server 只认
,PostgreSQL 两者都接受(
是别名)。别硬记哪个“更标准”,先查你手头数据库的文档,或者直接试跑:
如果报错,就换
。
SUBSTRING函数的三个参数怎么填才不越界
标准写法是
,但注意:起始位置从 1 开始(不是 0),且超出字符串长度不会报错,而是静默返回空或截到末尾。常见翻车点:
→ 返回空字符串(不是报错,容易被忽略)
→ 在 MySQL 中会从末尾倒数(
?错,其实是
),但在 PostgreSQL 或 SQL Server 中直接报错
省略
参数时,MySQL 和 PostgreSQL 支持(取到末尾),SQL Server 要求必须提供
想从右往左截取?别硬算位置,用组合函数
没有原生 “RIGHT” 函数的数据库(比如 PostgreSQL),靠
实现“取后 3 位”得这样写:
。但要注意
对 NULL 和空字符串的处理——
是 NULL,整个表达式就变成 NULL。稳妥做法:
加
防 NULL
用
避免负数起始位
MySQL 用户可以直接用
,但别指望它在其他库能跑
性能敏感场景下,SUBSTRING会拖慢查询吗
单纯在
列表里用
影响很小;但如果写在
条件里对字段做截取(比如
),会导致该列无法走索引——即使 phone 上建了索引也没用。这时候应该考虑:
提前把前缀存成单独字段(如
),并加索引
用前缀匹配替代截取:
(可走索引)
某些数据库(如 PostgreSQL)支持函数索引:
字符串截取本身不重,但让它出现在过滤条件里,就很容易成为慢查询的隐形推手。
SUBSTRINGSUBSTRSUBSTRSUBSTRINGSUBSTRSUBSTR('abcde', 2, 3)SUBSTRINGSUBSTRING(string, start, length)SUBSTRING('hello', 6, 2)SUBSTRING('hello', -1, 2)'he''lo'lengthSUBSTRINGSUBSTRING(col, LENGTH(col) - 2, 3)LENGTHLENGTH(NULL)COALESCE(LENGTH(col), 0)GREATEST(1, LENGTH(col) - 2)RIGHT(col, 3)SELECTSUBSTRINGWHEREWHERE SUBSTRING(phone, 1, 3) = '138'phone_prefixWHERE phone LIKE '138%'CREATE INDEX idx_phone_prefix ON t (SUBSTRING(phone, 1, 3))