【问题标题】:CAMLQuery with multiple or conditions?具有多个或条件的 CAMLQuery?
【发布时间】:2016-05-03 01:38:31
【问题描述】:

我正在尝试在下面的 CAMLQuery 中添加另一个 OR 条件,但似乎没有任何效果。有人可以帮忙吗?

这是现有的和有效的查询。我正在尝试添加另一个 Or 条件,以便查询为 (Permissions_Type = x1 OR Permissions_Type = x2) AND (Category = y1 OR Category = y2) AND (User_Specific = z1 OR User_Specific = z2)。

<Query>
<Where>
    <And>
        <And>
            <Or>
                <Eq>
                    <FieldRef Name="Permissions_Type"/>
                    <Value Type="Lookup">User</Value>
                </Eq>
                <Eq>
                    <FieldRef Name="Permissions_Type"/>
                    <Value Type="Lookup">Superuser</Value>
                </Eq>
            </Or>
            <Or>
                <Eq>
                    <FieldRef Name="Category"/>
                    <Value Type="Text">Survey</Value>
                </Eq>
                <Eq>
                    <FieldRef Name="Category"/>
                    <Value Type="Text">Notification</Value>
                </Eq>
            </Or>
        </And>
        <Geq>
            <FieldRef Name="Event_End" />
            <Value Type="DateTime"><Today Offset="-1" /></Value>
        </Geq>
    </And>
</Where>
<OrderBy><FieldRef Name="Created" Ascending="FALSE" /></OrderBy>
</Query>

我希望这是我的附加条件...或多或少 User_Specific 为 null 或 User_Specific = z

<Or>
    <IsNull><FieldRef Name="User_Specific"/></IsNull>
    <Eq>
        <FieldRef Name="User_Specific"/>
        <Value Type="Number">9</Value>
    </Eq>
</Or>

【问题讨论】:

  • 您的工作查询与您在上面描述的方式不同。它本质上是在说:(Permissions_Type = a OR Permissions_Type = b) AND (Category = x OR Category = y) 那么,当您向其添加另一组 OR 条件时,您是否希望它保持这种行为? (Permissions_Type = a OR Permissions_Type = b) AND (Category = x OR Category = y) AND (User_Specific = j OR User_Specific = k) 之类的东西?
  • 感谢您的澄清。我更新了。

标签: sharepoint caml


【解决方案1】:

需要记住的是,每个 &lt;And&gt;&lt;Or&gt; 节点都需要恰好两个子节点。

当您有两个以上的 AND 或 OR 条件时,您需要根据需要使用嵌套的 &lt;And&gt;&lt;Or&gt; 节点将它们组合起来。

在规划逻辑时,将 AND 和 OR 视为函数可能会有所帮助,每个函数都只接受两个参数:

AND( 
    OR(permissions=user, permissions=superuser), 
    AND( 
        OR(category=survey, category=notification), 
        OR(user_specific=z1, user_specific=z2)
    )
)

当你把它翻译成 CAML 时,你会得到这样的结果:

<Where>
    <And>
        <And>
            <Or>
                <Eq>
                    <FieldRef Name="Permissions_Type"/>
                    <Value Type="Lookup">User</Value>
                </Eq>
                <Eq>
                    <FieldRef Name="Permissions_Type"/>
                    <Value Type="Lookup">Superuser</Value>
                </Eq>
            </Or>
            <And>
                <Or>
                    <Eq>
                        <FieldRef Name="Category"/>
                        <Value Type="Text">Survey</Value>
                    </Eq>
                    <Eq>
                        <FieldRef Name="Category"/>
                        <Value Type="Text">Notification</Value>
                    </Eq>
                </Or>
                <Or>
                    <IsNull><FieldRef Name="User_Specific"/></IsNull>
                    <Eq>
                        <FieldRef Name="User_Specific"/>
                        <Value Type="Number">9</Value>
                    </Eq>
                </Or>
            </And>
        </And>
        <Geq>
            <FieldRef Name="Event_End" />
            <Value Type="DateTime"><Today Offset="-1" /></Value>
        </Geq>
    </And>
</Where>

(我必须在最后为您的&lt;Geq&gt; 条件添加一个额外的&lt;And&gt;。)

【讨论】:

  • 显然我的 User_Specific 列名或列类型有问题。不确定到底是什么。无论如何。我删除并在不同的列名下重新创建。有效! :)
猜你喜欢
  • 2019-10-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-21
  • 2017-10-22
  • 2020-10-17
  • 2014-03-11
  • 2017-12-10
相关资源
最近更新 更多