ArangoDB LIKE函数无法筛选含'*'值,查询返回空结果求助
问题根源:混淆了AQL LIKE与SQL LIKE的通配符规则
你遇到的问题核心是搞混了ArangoDB AQL中LIKE()函数的通配符逻辑和传统SQL的LIKE规则,并不是ArangoDB本身的问题。
先明确AQL LIKE的核心规则:
- 在AQL的
LIKE()函数里,*才是匹配任意长度字符(包括0个)的通配符(对应SQL里的%);?是匹配单个字符的通配符(对应SQL里的_)。 - 要匹配字面量的
*、?或转义符\,需要用\进行转义;而%和_在AQL LIKE里只是普通字符,不需要转义。
你的查询为什么返回空?
你写的查询:
FOR doc IN PatternInfo FILTER LIKE(doc.pattern, "%test*n%", false) RETURN doc
这里的%是普通字符,*是通配符,所以这个查询的实际逻辑是:找pattern字段中包含%test + 任意字符 + n%的文档。你的三个文档里没有符合这个条件的,自然返回空结果。
正确的解决方案
如果你要筛选包含字面量*的pattern,有两种简单的方式:
方案1:用CONTAINS()函数(更直观)
CONTAINS()是直接检查字符串是否包含指定子串,不需要处理通配符,代码更简洁:
FOR doc IN PatternInfo FILTER CONTAINS(doc.pattern, "*") RETURN doc
这个查询会正确返回前两个文档(abcde*fgh和test*new)。
方案2:用LIKE()函数(严格按需求使用LIKE)
如果一定要用LIKE(),需要转义字面量的*,同时用通配符匹配前后的任意字符:
FOR doc IN PatternInfo FILTER LIKE(doc.pattern, "*\\*", false) RETURN doc
这里的\\*是转义后的字面量*,前后的*是通配符,表示匹配任意包含*的字符串。
关于官方文档的小误解
你提到官方文档说LIKE仅需转义%和_,大概率是混淆了传统SQL的LIKE规则和AQL的LIKE规则。ArangoDB的AQL LIKE确实以*/?作为通配符,只有这两个符号和转义符\需要转义。
内容的提问来源于stack exchange,提问作者Rupak Karna
相关产品推荐
相关产品推荐

