square和sqrt仅在sql server中原生支持,postgresql、mysql、sqlite、oracle等主流数据库均不支持,需用power(x,2)和power(x,0.5)或x*x替代。

SQL里SQUARE和SQRT函数在哪些数据库能用?
SQUARE 和 SQRT 不是 SQL 标准函数,它们只在 Microsoft SQL Server(T-SQL)中原生支持。PostgreSQL、MySQL、SQLite、Oracle 等主流数据库不识别这两个函数,直接使用会报错 Invalid column name 'SQUARE' 或类似提示。
- SQL Server:✅ 原生支持,可直接用
- PostgreSQL:❌ 无
SQUARE,用POWER(x, 2)或x * x;开方用sqrt(x)(小写) - MySQL:❌ 无
SQUARE,用POW(x, 2)或x * x;开方用SQRT(x)(注意大小写不敏感但函数名不同) - SQLite:❌ 无
SQUARE,需x * x;开方用sqrt(x)(需加载 math extension 或用 CAST + 其他方式模拟)
SQL Server中SQUARE和SQRT的正确用法与常见错误
SQUARE 接收一个数值表达式,返回其平方值(类型与输入一致,如 INT 输入 → INT 输出);SQRT 返回非负数的平方根,输入为负会报错 A domain error occurred。
-
SQUARE只接受单个参数,不能写成SQUARE(col1, col2) -
SQRT要求输入 ≥ 0,对 NULL 返回 NULL,对负数直接中断查询 - 两者都不支持字符串隐式转换,
SQRT('4')在 SQL Server 中会报错,必须显式转成数值:SQRT(CAST('4' AS FLOAT)) - 若字段可能为负或 NULL,务必加防护:
SELECT col1, CASE WHEN col1 >= 0 THEN SQRT(col1) ELSE NULL END AS sqrt_col1, SQUARE(col1) AS square_col1 FROM data_table;
跨数据库兼容的平方/开方写法(推荐替代方案)
想写一次 SQL 跑多个数据库?放弃 SQUARE/SQRT,改用标准数学表达式:
- 平方:统一用
col * col(最安全,所有数据库都支持,且不依赖函数) - 开方:按数据库选:
- SQL Server:可用
SQRT(col),但也可用POWER(col, 0.5) - PostgreSQL / MySQL / SQLite:用
POWER(col, 0.5)或对应方言的sqrt(col)
- SQL Server:可用
- 注意浮点精度:整数列如
INT直接开方可能截断,建议先转FLOAT或DECIMAL:SQRT(CAST(col AS FLOAT))
实际开发中,如果项目已绑定 SQL Server,用 SQUARE/SQRT 没问题;但只要存在迁移、兼容或 ORM 映射需求,col * col 和 POWER(col, 0.5) 是更稳妥的选择。
为什么SQRT(-1)报错而SQUARE(-1)不报错?
SQUARE 是纯代数运算,负数平方后恒为正,无定义域限制;SQRT 在实数范围内仅对非负数有定义。SQL Server 默认按实数处理,不提供复数支持。即使你传入 -0.0(带符号零),SQRT 也会返回 0.0;但 -0.0001 就立刻触发 domain error。
- 这不是 bug,是设计选择:SQL 标准数学函数面向业务数据,极少需要复数
- 如果业务逻辑中真要容错负值,别靠 TRY/CATCH 包裹整个 SELECT,优先在 WHERE 或 CASE 里过滤或替换:
COALESCE(NULLIF(col, -1), 0)类推
真正容易被忽略的是隐式类型转换边界——比如 TINYINT 字段用 SQUARE 后可能溢出(255² = 65025 > SMALLINT 最大值 32767),结果被静默截断或报错,取决于 SET ARITHABORT 设置。











