如何使用嵌套的 AND 或 OR 编写 CAML 查询

How to write CAML query with nested ANDs or ORs

在您开始建议使用 U2U CAML Editor 或 CAML Designer 2013 之前,我已经尝试了两者,none 它们允许我以一种直观的方式对 ANDS/ORS 语句进行分组以执行正确的查询。

如果 Bill 循环使用某些字段,我有一个列表,在 SQL 这将非常容易:

WHERE (Content Type='Bill Cycle')
  AND (Status != 'Completed' ANDStatus!='Terminated' and Status!=NULL)
  AND (JobAdvisor:xyz OR JobPartner:xyz or JobManager:xyz or Reviewer:xyz or AnotherUserField:xyz)

我的代码或多或少是这样的:但我没有在这里对 2 个大语句进行分组

<And>
    <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>
        <IsNull>
            <FieldRef Name='Bill_x0020_Preparation_x0020_Status' />
        </IsNull>
    </And>  
    <Eq>
        <FieldRef Name='ContentType' />
        <Value Type='Computed'>Bill Cycle</Value>
    </Eq>
</And>

<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>
    </Or>
    <Contains>
            <FieldRef Name='Bill_x0020_Preparer' />
            <Value Type='User'>a</Value>
    </Contains>
</Or>

只是按照您的 SQL 示例...外部的 and 的三件事:Bill Cycle 测试、and'ed 状态测试和 OR 块。

<And>

  <Eq>
    <FieldRef Name='ContentType' />
    <Value Type='Computed'>Bill Cycle</Value>
  </Eq>

  <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>
    <IsNull>
      <FieldRef Name='Bill_x0020_Preparation_x0020_Status' />
    </IsNull>
  </And>

  <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>
    </Or>
    <Contains>
      <FieldRef Name='Bill_x0020_Preparer' />
      <Value Type='User'>a</Value>
    </Contains>
  </Or>

</And>