如何编写含嵌套AND/OR的CAML查询?已尝试两款编辑器仍存问题
解决CAML复杂逻辑分组问题
我完全懂你的困扰——那些可视化工具在处理需要精准嵌套的AND/OR逻辑时,确实没法做到直观分组,写出来的CAML要么结构混乱要么不符合需求。咱们直接基于你的SQL逻辑,写出结构清晰、分组正确的CAML查询。
首先先明确你的核心逻辑:
WHERE
(Content Type='Bill Cycle')
AND
(Status != 'Completed' AND Status!='Terminated' AND Status IS NOT NULL)
AND
(JobAdvisor:xyz OR JobPartner:xyz OR JobManager:xyz OR Reviewer:xyz OR AnotherUserField:xyz)
CAML要求每个<And>/<Or>只能包含两个子节点,所以需要严格嵌套来实现多条件的逻辑组合。另外注意你原来代码里的<IsNull>是错误的,对应SQL的Status!=NULL应该用<IsNotNull>。
下面是完全符合你需求的CAML代码:
<Query> <Where> <!-- 最外层:三个大条件的AND组合 --> <And> <!-- 第一个条件:内容类型为Bill Cycle --> <Eq> <FieldRef Name='ContentType' /> <Value Type='Computed'>Bill Cycle</Value> </Eq> <And> <!-- 第二个条件:状态的三个限制(非Completed、非Terminated、不为空)的AND组合 --> <And> <Neq> <FieldRef Name='Bill_x0020_Preparation_x0020_Status' /> <Value Type='Text'>Completed</Value> </Neq> <Neq> <FieldRef Name='Bill_x0020_Preparation_x0020_Status' /> <Value Type='Text'>Terminated</Value> </Neq> </And> <IsNotNull> <FieldRef Name='Bill_x0020_Preparation_x0020_Status' /> </IsNotNull> </And> <!-- 第三个条件:五个用户字段的OR组合 --> <Or> <Or> <Or> <Or> <Contains> <FieldRef Name='Billing_x0020_Advisor_x0020_Reviewers' /> <Value Type='User'>a</Value> </Contains> <Contains> <FieldRef Name='Final_x0020_P_x002F_D_x0020_Approver' /> <Value Type='User'>a</Value> </Contains> </Or> <Contains> <FieldRef Name='BillManager' /> <Value Type='User'>a</Value> </Contains> </Or> <Contains> <FieldRef Name='Bill_x0020_Preparer' /> <Value Type='User'>a</Value> </Contains> </Or> <!-- 补上你提到的AnotherUserField,可根据实际字段名调整 --> <Contains> <FieldRef Name='AnotherUserField' /> <Value Type='User'>a</Value> </Contains> </Or> </And> </Where> </Query>
逻辑分组说明:
- 最外层的
<And>把三个核心逻辑块绑定在一起:内容类型校验、状态校验、用户字段校验 - 状态校验部分用两层
<And>嵌套,完美实现Status != 'Completed' AND Status!='Terminated' AND Status IS NOT NULL的逻辑 - 用户字段部分用四层
<Or>嵌套,实现五个用户字段的或逻辑(已补上你提到的AnotherUserField,可根据实际字段名修改)
这样的结构完全对应你SQL里的分组逻辑,每个嵌套层级都清晰,不会出现逻辑混乱的问题。
内容的提问来源于stack exchange,提问作者Luis Valencia
相关产品推荐
相关产品推荐

