SQL标准中没有CHOSEN或通用IIF函数;CHOSEN在任何主流数据库中均不存在,IIF仅SQL Server和Access支持,跨库需统一使用CASE WHEN。

SQL 标准里没有 CHOSEN 函数,也不存在通用的 IIF 函数 —— 这两个都不是 ANSI SQL 规范函数,直接写会报错。
为什么你查不到 CHOSEN 或标准 IIF
不同数据库对条件表达式的支持差异很大:CHOSEN 在任何主流 SQL 引擎(PostgreSQL、MySQL、SQL Server、SQLite、Oracle)中均不存在;IIF 仅在 SQL Server 和 Access 中原生支持,其他数据库不识别。硬写 IIF(col > 0, 'yes', 'no') 在 PostgreSQL 或 MySQL 里会直接触发 ERROR: function iif(boolean, unknown, unknown) does not exist 类错误。
各数据库真正可用的等价写法
所有主流数据库都支持 CASE WHEN,它是跨平台、可嵌套、能用于 SELECT/WHERE/ORDER BY 的唯一可靠方案。替代 IIF 时注意参数顺序和类型一致性:
- SQL Server 可用
IIF(condition, true_result, false_result),但嵌套三层以上就难读,且不支持NULL分支单独处理 - PostgreSQL / Oracle / SQLite:必须用
CASE WHEN condition THEN result ELSE other END;ELSE NULL不能省略,否则默认补NULL,但显式写出更安全 - MySQL 支持
IF(condition, true_result, false_result)(注意是小写IF,不是IIF),但它不支持在 GROUP BY 中直接使用,而CASE可以
容易踩的坑:类型隐式转换毁掉整个分支
条件分支结果列若类型不一致,数据库会尝试强制转换,常导致截断、精度丢失或运行时报错。例如:
SELECT CASE WHEN id = 1 THEN 'active' ELSE 0 END FROM users;
在 PostgreSQL 中会报 ERROR: CASE types text and integer cannot be matched;SQL Server 可能静默转成字符串但值变成 '0',后续计算出错。正确做法是统一类型:
- 全部转字符串:
CASE WHEN ... THEN 'active' ELSE 'inactive' END - 全部转数字:
CASE WHEN ... THEN 1 ELSE 0 END - 需要混合类型?用
CAST(... AS VARCHAR)或TO_CHAR()显式转换
性能与可维护性提醒
简单二选一分支用 IIF(SQL Server)或 IF(MySQL)看着短,但一旦加个“否则为 NULL”或扩展成三元,就得改写成 CASE。团队协作或跨库迁移时,统一用 CASE 能省去大量排查时间。另外,CASE 表达式在 WHERE 子句中可能阻止索引使用,如果分支逻辑复杂,优先考虑把条件拆到 JOIN 或子查询里。
别被函数名迷惑——真正该记住的是:只要不确定目标数据库,就写 CASE WHEN;只要涉及多分支或类型混合,CASE 是唯一不出错的选择。










