JQuick-SQL CASE WHEN 与函数:在查询中构建业务字段

JQuick-SQL CASE WHEN 与函数:在查询中构建业务字段

Meta 描述:学习 jquick-sql 的 CASE WHEN、toUpper、算术表达式与聚合函数,用可执行 Java 示例在注册数据集上构建分级、标签和指标字段。

标签:jquick-sql、CASE WHEN、SQL 函数、toUpper、SQL 表达式、轻量级 SQL 引擎、Java 跨库查询

官网示例:

前言

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.

相关推荐
Pniubi2 小时前
MySQL靠什么实现事务的?事务隔离级别有哪些?
java·数据库·mysql
数据库小学妹2 小时前
pgbouncer 事务池:prepared statement、临时表与会话状态
数据库·后端·postgresql
Lucifer三思而后行3 小时前
最近折腾了一下金仓数据库的备份恢复
数据库·备份恢复
草莓熊Lotso4 小时前
【C++ 基于微服务的即时通讯系统】文件存储子服务实战:UUID生成、文件IO封装与全接口单元测试
开发语言·网络·数据库·c++·微服务·架构·单元测试
进击的荆棘5 小时前
MySQL——库的操作
数据库·mysql
2601_967980115 小时前
“小程序·云开发”上线 助力开发者的高效利器
数据库·存储管理·小程序云开发·云函数·开发者工具
zhangjw346 小时前
1-9 SELECT 查询基础:where、group by、having、order by、limit offset
数据库·postgresql·pg数据库
唐老板6 小时前
Postgres 慢查询,先取证再动手
数据库·ai编程
笃行35013 小时前
数据库性能优化的五处内核改造,KingbaseES 配了四件诊断工具
数据库
非优秀程序员15 小时前
第02章 杭电的英语老师与一台服务器|《互联网产品恩仇录》
数据库·node.js·代码规范