关于 like 函数和简单 sql 中的 like
like 在 SPL 的语法中有两个地方,一个是在简单 SQL 语句里有提到,另一个是函数里有 like。官方在简单 sql 语句里对 like 的用法描述是这样的:
其中 1、2 两个能出结果,但 3、4 两个列表的用法,一直试不出结果。我的理解应该是这样的:
1、[a-e] 等同于 [abcde] 序列中的任意一个;
2、like ‘[AB]C’ 应该能匹配到 AC 和 BC;
3、like ‘[a-d]1’ 应该能匹配到 a1,b1,c1,d1
但上述用法一直出不了结果。
函数里的 like 用法跟上述应该是类似的,*?%_,这些通配符都没有问题。不知道函数里的 like 是否支持 [],[!],[^] 这样的集合用法?SPL 中的模糊匹配,能和 select 函数配合使用的,好像除了 like 就没有其他的了。恳请大佬们方便的时候指点一下:
1、如何使用上述集合写法 [],[!],[^],我一直没试出来结果;
2、函数 like 可否支持正则,模拟正则里的 test,返回 boolean;
3、like 函数是否支持索引优化,比如,前缀模糊 "*xxx",后缀模糊 "xxx*“, 两端模糊”*xxx*" 这 3 种模式是否有优化的手段?
谢谢!
这个应该是文档写错了,搞不清从哪里抄来的。简单 SQL 的 LIKE 从来没支持过正则表达式,like 函数也只支持基本的 * 和?,这两者就是通配符不同,功能没区别。
正则表达式有 s.regex 去支持。
全文索引在组表上支持,要数据量大到一定程度才有意义。
谢谢老贼回复😄
like ‘[a-e]f’ 这个语法在 MySql 里是有的,PostgreSQL 也有 like 支持正则的语法。我还高兴了一下,想着 SPL 给集成进来了。
如果是这样的话,个人感觉 like 的功能稍微弱了一点,模糊查询匹配,且不管其效率如何,处理某些场景的时候确实是一个好方法。
比如,有这么一个小例子,有一个关键字列表 [a,b,c],想从表的某个字段中找到包含有关键字列表中任意一个关键字的记录。
我目前是这样写的:
表.select([a,b,c].count(pos( 字段名,~))>0)
如果 like 支持集合,可以写成这样,简短一些:
表.select(like( 字段,“%[abc]%”))
.select(xx.regex(“[abc]”) )
谢谢老贼指点!懂了🙏 🙏
我从今年 7 月 15 日开始学习 SPL,这两个月里都在逐字逐句看函数官方文档😄,收获不小。
还没涉及到 SPL 真正核心特有的东西,比如存储格式,性能优化,游标等,天赋有限,自学很费劲。
SPL 值得学习,继续加油!