MarkLogic Optic库op:sql-condition多LIKE条件失效求助
解决MarkLogic Optic库多AND LIKE条件失效问题
问题分析
你当前的op:sql-condition语法本身无错误,但仅返回匹配第一个条件的结果,大概率是以下两种原因之一:
- 若
Employee.employeeName是单值字符串字段:要么文档中没有同时包含JOHN、Smith、Eric三个子串的记录,要么大小写匹配规则导致后两个条件未命中; - 若
Employee.employeeName是多值字段(一个文档对应多个员工姓名):原查询要求同一个employeeName值同时包含三个子串,不符合实际数据结构,逻辑错误。
修改方案
方案1:单值字符串字段场景
优化大小写匹配(避免大小写敏感问题)
使用LOWER()函数统一转换为小写后匹配,确保不遗漏大小写不同的记录:
op:sql-condition("LOWER(Employee.employeeName) LIKE '%john%' AND LOWER(Employee.employeeName) LIKE '%smith%' AND LOWER(Employee.employeeName) LIKE '%eric%'")
改用Optic原生函数(更可靠的语法解析)
替换op:sql-condition为Optic原生的op:where+op:and+op:like组合,避免SQL语法解析的潜在问题:
op:where( op:and( op:like(op:col("Employee.employeeName"), "%JOHN%"), op:like(op:col("Employee.employeeName"), "%Smith%"), op:like(op:col("Employee.employeeName"), "%Eric%") ) )
方案2:多值字段场景(文档包含多个员工姓名)
需要判断文档中是否同时存在匹配三个子串的不同employeeName条目,可通过op:exists子查询实现:
-- 替换为实际的schema和视图名 op:from-view("your-schema", "employee-view") => op:where( op:and( -- 验证文档存在包含JOHN的姓名 op:exists( op:from-view("your-schema", "employee-view") => op:where(op:like(op:col("Employee.employeeName"), "%JOHN%")) => op:on(op:col("doc-id"), op:col("doc-id")) ), -- 验证文档存在包含Smith的姓名 op:exists( op:from-view("your-schema", "employee-view") => op:where(op:like(op:col("Employee.employeeName"), "%Smith%")) => op:on(op:col("doc-id"), op:col("doc-id")) ), -- 验证文档存在包含Eric的姓名 op:exists( op:from-view("your-schema", "employee-view") => op:where(op:like(op:col("Employee.employeeName"), "%Eric%")) => op:on(op:col("doc-id"), op:col("doc-id")) ) ) )
内容的提问来源于stack exchange,提问作者Jagruti Padhiyar
相关产品推荐
相关产品推荐

