从 SQL 到 SPL:查找字段中包含指定字符串组的记录
Oracle 数据库的某表有多个字符串字段。
fname |
lname |
street |
city |
return from select |
John |
Doe |
mainstreet |
New York |
yes |
John |
Doe |
street |
New York |
no |
Doe |
John |
mainstreet |
New York |
yes |
mainstreet |
John |
doe |
New York |
yes |
c2 |
c2 |
c3 |
c4 |
c5 |
现在要输入以逗号为分隔符、含有多个字符串的参数,要求从该表中找出字段包含所有这些字符串的记录,或者说字段的集合是参数的超集的那些记录。比如,当参数 argA="street,John,Doe" 时,计算结果如下:
fname |
lname |
street |
city |
return from select |
John |
Doe |
street |
New York |
no |
可以将字符串参数和每条记录分别转为集合,过滤出两者的差集为空集的那些记录。但SQL将字符串参数拆分成集合并不容易,要用正则表达式和CONNECT BY函数,代码比较繁琐,有些数据库还不支持这种写法,只能用自定义函数或存储过程实现,那就更麻烦了。将某条记录转为集合也很麻烦,通常要对每个字段写出比较判断,非常繁琐。
SPL提供了直接可用的函数,可以将字符串参数和记录方便地转为集合进行交并差运算。
A |
|
1 |
=orcl.query("select * from tb") |
2 |
=argA.split@c() |
3 |
=A1.select(A2\~.array()==[]) |
A1:通过JDBC查询数据库。
A2:按逗号将参数拆分为字符串集合。函数split按指定分隔符拆分字符串,@c表示分隔符是逗号。
A3:过滤出参数与字段集合的差集为空集的记录,相当于求字段的集合是参数的超集的那些记录。
英文版 https://c.scudata.com/article/1733272712678