最稳妥写法是case when is_active then '是' else '否' end;若字段可能为null,需用case when col is true then '是' when col is false then '否' else '未知' end。

PostgreSQL 中用 CASE 将布尔字段转为中文“是/否”
PostgreSQL 原生不支持直接把 BOOLEAN 转成字符串,CAST(col AS TEXT) 会得到 't'/'f',不是想要的“是/否”。必须显式映射:
-
CASE WHEN is_active THEN '是' ELSE '否' END是最稳妥写法,语义清晰、兼容所有版本 - 别用
COALESCE(col::TEXT, '')—— 布尔转文本不会为 NULL,但结果仍是't',毫无意义 - 如果字段可能为 NULL,需单独处理:
CASE WHEN col IS TRUE THEN '是' WHEN col IS FALSE THEN '否' ELSE '未知' END
MySQL 8.0+ 用 IF() 或 CASE 处理 TINYINT(1) 假布尔
MySQL 没有真布尔类型,BOOLEAN 只是 TINYINT(1) 的别名,存的是 0/1。直接 col + '' 会得 '0'/'1',仍需转换:
-
IF(is_deleted = 1, '已删除', '未删除')简洁直观,适合二值场景 -
CASE is_deleted WHEN 1 THEN '已删除' ELSE '未删除' END更易扩展多状态(比如加WHEN 2 THEN '审核中') - 避免
CONVERT(is_deleted, CHAR)—— 结果是字符'0'/'1',不是文字描述
SQL Server 用 IIF() 或 CASE 处理 BIT 类型
SQL Server 的 BIT 字段值为 0/1/NULL,CAST(col AS VARCHAR) 得 '0'/'1',不能直接读:
-
IIF(is_published = 1, '已发布', '未发布')是 SQL Server 2012+ 推荐写法,比CASE简短 - 若要兼容老版本或需处理 NULL:
CASE WHEN is_published = 1 THEN '已发布' WHEN is_published = 0 THEN '未发布' ELSE '待定' END - 别用
CHOOSE(is_published + 1, '未发布', '已发布')—— 当is_published为 NULL 时整个表达式返回 NULL,丢失状态
通用建议:别依赖数据库隐式转换,统一用 CASE 显式控制
不同数据库对布尔/位类型转字符串的行为差异大:TRUE 在 PostgreSQL 输出 't',在 SQLite 是 '1',在 Oracle 根本没原生布尔类型。靠函数自动转容易出错:
- 所有主流方言都支持标准
CASE,一次写好,跨库迁移风险最低 - 如果展示逻辑复杂(如“启用中”“禁用中”“等待确认”),提前在 SQL 层用
CASE分支,别丢给应用层拼接 - 注意 NULL:布尔字段为 NULL 时,
WHEN TRUE和WHEN FALSE都不匹配,必须用IS TRUE/IS FALSE或显式IS NULL判断
真正麻烦的不是写几行 CASE,而是漏掉 NULL 或假设所有数据库都把 TRUE 转成 'true' —— 这类假设在线上查半天才发现。










