CSDN乘风破浪的 SQL( 二 )


除此之外 , 我们也可以将 JSON 数据转换为关系型数据 。 例如:
select emp_id, jt.*from employee_json,json_table(emp_info, '$'columns (emp_name varchar(50) path '$.emp_name',sex varchar(10) path '$.sex',dept_id integer path '$.dept_id',manager integer path '$.manager',hire_date date path '$.hire_date',job_id integer path '$.job_id',salary integer path '$.income[0].salary',bonus integer path '$.income[1].bonus',email varchar(100) path '$.email')) jtlimit 3;emp_id|emp_name |sex|dept_id|manager|hire_date |job_id|salary|bonus|email |1|刘备 |男 | 1| |2000-01-01| 1| 33000|10000|liubei@shuguo.com |2|关羽 |男 | 1| 1|2000-01-01| 2| 26000|10000|guanyu@shuguo.com |3|张飞 |男 | 1| 1|2000-01-01| 2| 24000|10000|zhangfei@shuguo.com|其中 , $ 表示将整个 emp_info 作为数据行的来源;COLUMNS 定义了字段类型及其数据的来源 , PATH 同样使用 SQL/JSON 路径表达式 。
反之 , 我们也可以通过 SQL 函数将关系型数据转换为 JSON 数据 。 例如:
select json_object('emp_name', emp_name,'sex', sex,'income', json_array(json_object('salary', salary), json_object('bonus', bonus))) AS jofrom employeelimit 3;jo||{"sex": "男", "income": [{"salary": 30000.00}, {"bonus": 10000.00}], "emp_name": "刘备"}{"sex": "男", "income": [{"salary": 26000.00}, {"bonus": 10000.00}], "emp_name": "关羽"}{"sex": "男", "income": [{"salary": 24000.00}, {"bonus": 10000.00}], "emp_name": "张飞"}|其中 ,JSON_OBJECT 和 JSON_ARRAY 函数可以将表中的数据构造成 JSON 对象和数组 。
不仅如此 , 使用 SQL 语句也可以对 JSON 节点数据进行 DML 操作 , 不再介绍具体案例 。 关于 MySQL 文档存储的详细介绍可以参考这篇文章 。
总之 , 关系数据库对于 JSON 数据类型的支持可以方便我们将 SQL 的强大功能与 NoSQL 的灵活性相结合;当我们需要为应用增加文档数据支持的时候 , 除了使用专门的 NoSQL 数据库之外 , 也可以考虑直接在现有的数据库中使用 JSON 数据类型 。
2016 年 SQL 标准增加的另一个重要的功能就是行模式识别(Row Pattern Recognition) 。
SQL 与复杂事件处理
SQL 行模式识别使用 MATCH_RECOGNIZE 子句表示 , 通过指定一个模式(正则表达式)查找多行数据之间的规律 , 并且可以对这些匹配的数据进行过滤、分组和聚合操作 。 行模式识别可以用于分析各种时间序列数据 , 例如股票行情数据分析、金融欺诈检测或者系统事件日志分析等 。
CSDN乘风破浪的 SQL
本文插图
目前只有 Oracle 12c 实现了该功能 , 我们可以使用以下语句找出股票曲线中的所有 V 型曲线:
-- Oracle 12c 实现SELECT * FROM stock MATCH_RECOGNIZE ( PARTITION BY scode ORDER BY tradedate MEASURES STRT.tradedate AS start_date, LAST(DOWN.tradedate) AS bottom_date, LAST(UP.tradedate) AS end_date ONE ROW PER MATCH AFTER MATCH SKIP TO LAST UP PATTERN (STRT DOWN+ UP+) DEFINE DOWN AS DOWN.price < PREV(DOWN.price), UP AS UP.price > PREV(UP.price) ) MR ORDER BY MR.scode, MR.start_date;其中 , MATCH_RECOGNIZE 子句比较复杂 , 它的执行过程如下: