从 SQL 到 SPL:从多个格式串取值到多条记录
有四个用竖线分隔成两部分的字符串,分别是:ID|DUE_DATE、80781|2026-12-01、VARCHAR2|DATE、|yyyy-mm-dd。现在要生成一个四字段的结果集,取出每个字符串的第 1 部分,作为第 1 条记录写入,再取出每个字符串的第 2 部分,作为第 2 条记录写入。
V_NAME |
V_VALUE |
V_TYPE |
V_FORMAT |
ID |
80781 |
VARCHAR2 |
|
DUE_DATE |
2026-12-01 |
DATE |
yyyy-mm-dd |
可以借助 Oracle 等数据库去实现,但 SQL 只有少量基础的字符串函数,缺乏集合相关的函数,将字符串拆分成批量记录会很麻烦。虽然 Oracle SQL 还支持强大的正则表达式,但在这里却派不上太大用处。SQL 的集合无序,也不方便按位置取集合成员,还要借助 ROW_NUMBER 或 CONNECT BY 间接实现,代码很繁琐。
SPL 有很多和集合相关的字符串处理函数,可以将字符串直观方便地解析为批量记录。SPL 也支持有序集合,可以直接按位置取集合成员,按任务的逻辑写出代码即可。
A |
|
1 |
=argStr.split@n("|") |
2 |
=create(V_NAME,V_VALUE,V_TYPE,V_FORMAT) |
3 |
=A2.record(A1.(~1)|A1.(~2)) |
A1:将参数解析为集合的集合。函数 split 可将字符串按指定分隔符解析为字符串集合,@n 表示先按回车符 \n 拆分,再按指定的分隔符拆分。参数 argStr 是回车符拼接的字符串,ID|DUE_DATE\n80781|2026-12-01\nVARCHAR2|DATE\n|yyyy-mm-dd。
A2:新建空结果集。
A3:取 A1 每个成员的第 1 个子成员,再取每个成员的第 2 个子成员,合并成一维集合,依次写入新结果集。如果记录有很多条,还可以循环取数:A1(1).len().conj(t=~,A1.(~(t)))
英文版 https://c.scudata.com/article/1734515417944