从 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://stackoverflow.com/questions/78340545/split-string-using-regexp-substr-in-oracle-sql-gone-wrong