简体   繁体   中英

CAML “NOT IN” query

Is there a way to do something like "NOT IN" behavior in SharePoint 2010? I can easily implement IN behavior like that:

<Where>
   <In>
      <FieldRef Name="ID"/>
      <Values>
         <Value Type="Counter">1</Value>
         <Value Type="Counter">2</Value>
         <Value Type="Counter">3</Value>
         <Value Type="Counter">4</Value>
         <Value Type="Counter">5</Value>
      </Values>
   </In>
</Where>

But is there a way to select all the values that DOES NOT IN Values enumeration?

Here is the USE CASE: I have a Lookup field with AllowMultipleValues = true, and I need to get all items from LookupList, which are not included into Lookup field

Thanks in advance!

Starting from SharePoint 2010, there's the NotIncludes element that might work for you. From MSDN:

If the specified field is a Lookup field that allows multiple values, specifies that the Value element is excluded from the list item for the field that is specified by the FieldRef element.

Template:

<NotIncludes>
    <FieldRef Name="Field_Name" />
    <Value Type="Field_Type" />
    <XML />
</NotIncludes>

To get the opposite behavior of 'In', you have to make a nested 'Neq' query. 'NotIncludes' could be substituted for or combined with 'Neq' if you are dealing with a Lookup Field with multiple values .

<Query>
    <Where>
        <And>
            <And>
                <Neq>
                    <FieldRef Name="ID" /><Value Type="Counter">5</Value>
                </Neq>
                <Neq>
                    <FieldRef Name="ID" /><Value Type="Counter">13</Value>
                </Neq>
            </And>
            <And>
                <NotIncludes>
                    <FieldRef Name="children" /><Value Type="Lookup">20</Value>
                </NotIncludes>
                <NotIncludes>
                    <FieldRef Name="children" /><Value Type="Lookup">32</Value>
                </NotIncludes>
            </And>
        </And>
    </Where>
</Query>

If you want more variables then more nesting needs to be done. Have fun.

I think the Not equal option would be the best way to build this CAML query

Maybe this (didn't test this, so bear with me)

<Query>
   <Where>
     <And>
       <Neq>
          <FieldRef Name="ID" /><Value Type="Counter">1</Value>
       </Neq>
       <Neq>
          <FieldRef Name="ID" /><Value Type="Counter">2</Value>
       </Neq>
       <Neq>
          <FieldRef Name="ID" /><Value Type="Counter">3</Value>
       </Neq>
     </And>
   </Where>
</Query>

You should have a look at the available Comparison Operators

  • Contains
  • BeginsWith
  • Eq, Equal
  • Neq, Not equal
  • Gt, Greater than
  • Lt, Less than
  • Geq, Greater than or equal to
  • Leq, Less than or equal to
  • DateRangesOverlap, Compare dates in recurring event with specified value
  • IsNotNull
  • IsNull

The closest I've come is to use <NotIncludes></NotIncludes> , but for some reason is does not work the same way as <In></In> . In <In> I can use <Values> . With <NotIncludes> it looks like you can only specify one value. The rest will have to be <Or> ed in, similar to <Neq> .

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM