从 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://stackoverflow.com/questions/78371969/search-for-multiple-strings-in-multiple-columns-in-oracle-sql