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.

相关推荐
一个天蝎座的程序猿38 分钟前
2TB传感器数据搬迁记:IoTDB数据导入导出实战详解(CSV/SQL/TsFile全踩了一遍)
数据库
charlotte1024102444 分钟前
Redis 简介:从诞生到数据类型,再到缓存三大问题
数据库·redis·缓存
ClouGence1 小时前
还在用命令行管理 Kafka?开源 CloudDM 让操作更简单
数据库·kafka·开源
骑着蜗牛撵大象3271 小时前
四种库收进一个SQL编辑器(下):跨库取数、方言对齐与四库巡检的落地拆解
jvm·数据库·sql·编辑器·数据迁移·跨库查询
惊讶的猫1 小时前
mysql-多表连接查询(JOIN)
数据库·sql·mysql
小羊没烦恼!1 小时前
TypedSql:在 C# 类型系统上实现一个 SQL 查询引擎
java·linux·运维·服务器·开发语言·数据库·mysql
码流子2 小时前
高速公路视频AI分析,算力该放哪:边缘、中心还是云边协同?
大数据·数据库·人工智能·物联网·音视频
xiaogai_gai2 小时前
委外出入库单从旺店通同步到 MySQL:基于轻易云的实战方案
数据库·mysql
极光通讯2 小时前
国产存储替代进展:长鑫DDR5与长江存储企业级SSD的适配现状
服务器·数据库·内存