
作者:胖头鱼的鱼缸(尹海文)
Oracle ACE Pro: Database
PostgreSQL ACE
10年+数据库行业经验
拥有OCM 11g/12c/19c、MySQL 8.0 OCP、Exadata、CDP等认证
墨天轮MVP,ITPUB认证专家
圈内拥有“总监”称号,非著名社恐(社交恐怖分子)
全网同名:胖头鱼的鱼缸
ITPUB:yhw1809
除授权转载并标明出处外,均为“非法”抄袭

Oracle AI Database 23.26.2在SQL/JSON路径表达式中新增了对DECODE和CASE函数的支持。这两个函数分别类似于SQL中的DECODE函数和CASE表达式,但它们在JSON路径表达式内部工作,主要用于JSON_TRANSFORM的右侧(RHS)路径表达式中,实现对JSON数据的条件逻辑处理。
语法:decode(expr, match1, result1, match2, result2, …, [default]) 行为:将expr依次与match值比较,返回第一个匹配的result无匹配时返回default(可选);无default时返回null 特点:基于离散值的精确匹配,适合枚举类型映射
语法:case(cond1, result1, cond2, result2, …, [default]) 行为:按顺序评估布尔条件,返回第一个为真的条件对应的result无条件为真时返回default(可选);无default时返回 null 特点:短路求值,支持范围比较和复杂条件
同之前一样,使用用户NFTEST,已授权DB_DEVELOPER_ROLE角色,测试操作均在NFTEST用户下执行。
CREATE TABLE json_path_test (
id NUMBER PRIMARY KEY,
data JSON
);
INSERT INTO json_path_test VALUES (1, '{"name":"Alice","age":30,"salary":50000,"dept":"Sales"}');
INSERT INTO json_path_test VALUES (2, '{"name":"Bob","age":25,"salary":75000,"dept":"Eng"}');
INSERT INTO json_path_test VALUES (3, '{"name":"Carol","age":35,"salary":120000,"dept":"Eng"}');
COMMIT;

SELECT id, JSON_TRANSFORM(data,
SET '$.tier' = PATH 'decode($.salary, 50000, "low", 75000, "medium", "high")'
) AS transformed
FROM json_path_test
ORDER BY id;

SELECT id, JSON_TRANSFORM(data,
SET '$.tier' = PATH 'decode($.salary, 50000, "low", 75000, "medium")'
) AS transformed
FROM json_path_test
ORDER BY id;

SELECT id, JSON_TRANSFORM(data,
SET '$.label' = PATH 'decode($.salary, "no match")'
) AS transformed
FROM json_path_test
ORDER BY id;

SELECT id, JSON_TRANSFORM(data,
SET '$.tier' = PATH 'case($.salary < 60000, "entry", $.salary < 100000, "mid", "senior")'
) AS transformed
FROM json_path_test
ORDER BY id;

SELECT id, JSON_TRANSFORM(data,
SET '$.tier' = PATH 'case($.salary < 60000, "entry", $.salary < 100000, "mid", "senior")'
) AS transformed
FROM json_path_test
ORDER BY id;

SELECT id, JSON_TRANSFORM(data,
SET '$.dept_label' = PATH 'decode($.dept, "HR", "Human Resources", "IT", "Information Tech", "Other")'
) AS transformed
FROM json_path_test
ORDER BY id;

UPDATE json_path_test
SET data = JSON_TRANSFORM(data,
SET '$.tier' = PATH 'decode($.salary, 50000, "low", 75000, "medium", "high")',
SET '$.eval' = PATH 'case($.age < 30, "young talent", $.age < 35, "established", "veteran")'
);
COMMIT;
SELECT id, dataFROM json_path_test ORDER BY id;

本期对Oracle AI Database 26ai,23.26.2版本新引入的WSQL/JSON路径表达式支持DECODE与CASE新特性进行了完整介绍与实战演示。
老规矩,知道写了些啥。