在 mysql 查询中,可通过 `if()` 函数或 `case` 表达式对字段值进行运行时判断与转换,适用于 datatables 等框架中动态渲染状态文本(如 “active”/“nonaktif”、“admin”/“users”),无需后端 php 逻辑处理。
在构建数据表格(如使用 CodeIgniter 的 Datatables 插件)时,常需将数据库中的布尔型或枚举型字段(如 is_active、is_role)转换为可读性更强的中文或英文标签。这类转换不应依赖 PHP 层循环处理,而应直接在 SQL 查询中完成,以提升性能、简化代码并保持逻辑一致性。
对于 is_active 这类只有两种状态(1/0)的字段,IF(condition, true_result, false_result) 是最简洁的选择:
$this->datatables->select("
id, username, password, email,
IF(is_active = 1, 'Active', 'Nonaktif') AS is_active,
IF(is_role = 1, 'Admin', IF(is_role = 2, 'Users', 'Other User')) AS is_role,
created_at, updated_at
");⚠️ 注意:嵌套 IF() 虽可行,但超过两层嵌套会显著降低可读性与维护性,不建议用于多分支场景。
当角色类型可能扩展(如后续增加 is_role = 3 → 'Editor' 或 4 → 'Guest'),CASE 语句更清晰、健壮且符合 SQL 标准:
$this->datatables->select("
id, username, password, email,
CASE
WHEN is_active = 1 THEN 'Active'
ELSE 'Nonaktif'
END AS is_active,
CASE
WHEN is_role = 1 THEN 'Admin'
WHEN is_role = 2 THEN 'Users'
WHEN is_role = 3 THEN 'Editor'
ELSE 'Unknown Role'
END AS is_role,
created_at, updated_at
");✅ 优势包括:
通过将状态映射逻辑下推至数据库层,不仅减少了 PHP 层的数据遍历开销,也使业务规则更集中、更易测试与复用。优先选用 CASE,让查询既强大又可持续演进。