JQuick-SQL CASE WHEN 与函数:在查询中构建业务字段
Meta 描述:学习 jquick-sql 的 CASE WHEN、toUpper、算术表达式与聚合函数,用可执行 Java 示例在注册数据集上构建分级、标签和指标字段。
标签:jquick-sql、CASE WHEN、SQL 函数、toUpper、SQL 表达式、轻量级 SQL 引擎、Java 跨库查询
官网示例:
- FORMULAS 示例页:https://www.jquick.org/jquick-sql
- github 地址:https://github.com/paohaijiao/jquick-sql
前言
CASE WHEN 和函数让 SQL 不只是取列,还能将原始字段转换为业务标签、计算值和聚合指标。jquick-sql 的 SELECT 测试已验证 CASE WHEN、toUpper(name)、算术表达式及聚合函数。作为 Java 分布式 SQL 查询引擎,它只处理已注册的数据集,不负责 JDBC 直连。
使用 CASE WHEN 构建分层字段
sql
SELECT id, name, age,
CASE WHEN age >= 30 THEN '中年'
WHEN age >= 20 THEN '青年'
ELSE '少年'
END AS age_group
FROM users
CASE WHEN 应覆盖主要业务分支,并用 ELSE 给未覆盖值明确的回退标签。结果别名使下游 JQuickDataSet 消费更直观。
字符函数、算术与常量投影
项目示例包含字符串大写、取反、常量和算术表达式:
sql
SELECT 0 AS index,
id,
toUpper(name) AS upper_name,
(age + 1) * 3 AS score
FROM users
表达式应使用与 JQuickColumnMeta 一致的类型。不要将字符串形式的数字当作数值计算字段注册。
CASE WHEN 参与排序与子查询
CASE 表达式也可用于排序权重:
sql
SELECT * FROM users
ORDER BY CASE status
WHEN 'active' THEN 1
WHEN 'pending' THEN 2
WHEN 'inactive' THEN 3
ELSE 4
END DESC
结合子查询时,可按关联记录数量生成标签。此类逻辑尤其适合上游已标准化的异构数据源联邦查询数据集。
可执行 Java 案例
java
import com.github.paohaijiao.engine.JQuickSQL;
import com.github.paohaijiao.statement.JQuickColumnMeta;
import com.github.paohaijiao.statement.JQuickDataSet;
import com.github.paohaijiao.statement.JQuickRow;
import java.util.Arrays;
public class CaseWhenFunctionsDemo {
public static void main(String[] args) {
JQuickSQL sql = JQuickSQL.embedded();
try {
sql.registerTable("users", Arrays.asList(
new JQuickColumnMeta("id", Integer.class, "users"),
new JQuickColumnMeta("name", String.class, "users"),
new JQuickColumnMeta("age", Integer.class, "users")
), Arrays.asList(
row("id", 1, "name", "Alice", "age", 25),
row("id", 2, "name", "Bob", "age", 30),
row("id", 3, "name", "Charlie", "age", 18)
));
JQuickDataSet result = sql.execute(
"SELECT id, toUpper(name) AS upper_name, " +
"CASE WHEN age >= 30 THEN 'HIGH' WHEN age >= 20 THEN 'MID' ELSE 'LOW' END AS age_level " +
"FROM users"
);
result.printTable();
} finally {
sql.shutdown();
}
}
private static JQuickRow row(Object... kv) {
JQuickRow r = new JQuickRow();
for (int i = 0; i < kv.length; i += 2) r.put((String) kv[i], kv[i + 1]);
return r;
}
}
常见问题
**CASE WHEN 必须有 ELSE 吗?**示例建议保留 ELSE,使未匹配值有明确输出。
**函数能在 WHERE 使用吗?**项目测试验证了 toUpper(name)='ALICE' 形式。
**这些表达式是否改变源数据?**不会,只影响当前查询产生的结果集。
总结与拓展
CASE WHEN 和函数可把分类规则、展示格式和派生指标集中在查询中,减少 Java 服务层重复处理。结合 GROUP BY、HAVING 和 ORDER BY,可让轻量级 SQL 引擎提供更完整的业务视图。
Core Advantage
Expressions and CASE logic create derived business fields without mutating source rows.
Applicable Scenarios
Status labels, score bands, normalized display fields, and priority-based ordering.