Live training: next batches coming soon. Join the waitlist:Waitlists open:Developer Training →Developer →Copilot Studio Training →Copilot Studio →

Power Automate Filter Array: Multiple Conditions, Contains, Variables and Output

If you’ve tried to pull a few rows out of a SharePoint list in a flow, you’ve probably seen it loop through every item, or hand back an empty array with no error.

The Filter array action fixes that. Give it an array in From and one condition that uses item(), and it returns only the matching items. Most empty results come from one small thing, like a Choice column compared without /Value.

In this tutorial, we’ll build a real power automate filter array flow on a 620-item SharePoint list, then filter it with one condition, multiple conditions in advanced mode, OR, contains and an array variable, use the output, and fix empty results.

The Sample List We’ll Use

Every example runs against one list: Service Requests on our SPGuides site. It has 620 items, and the flow reads them with the Get items action in Power Automate.

ColumnTypeSample values
TitleSingle line of textLaptop replacement #1000, Printer jam #1003
StatusChoiceNew, In Progress, Closed
PriorityChoiceLow, Normal, High
RequesterSingle line of textMegan Bowen, Alex Wilber, Adele Vance
DueDateDate and time1/5/2026 to 10/11/2026
Service Requests SharePoint list with Status and Priority choice columns used in the Filter array demo

Status and Priority are Choice columns. Keep that in mind, because it changes how you reference them in a filter.

Build the Demo Flow Step by Step

If you’ve never added a data action before, follow these steps once. You’ll find more starter flows on our Power Automate tutorials page.

  1. Go to make.powerautomate.com, select Create > Instant cloud flow, pick Manually trigger a flow, name it SPGuides Filter Array demo and select Create.
  2. Select the plus sign (+) under the trigger, search for Get items and pick the SharePoint action.
  3. Set Site Address to your site and List Name to Service Requests.
  4. Open Advanced parameters, add Top Count and enter 1000. You’ll see why in the troubleshooting section.
Get items action with the Service Requests list and Top Count set to 1000
  1. Select + again, type Filter array in the Add an action search box and pick Filter array under Data Operation.
  2. Click the From box, open dynamic content (the lightning bolt) and pick value from Get items. That’s the array of list items.
  3. Rename the action so it’s easy to reference later, for example Filter High priority.
Add an action pane in Power Automate with Filter array under Data Operation

To test, select Save, then Test > Manually > Test > Run flow. Open the run and click any action to see its inputs and outputs.

Method 1: Filter With One Condition in Basic Mode (Recommended)

Use basic mode when you test one column against one value. It’s the easiest to read later.

Here’s the setup for High-priority requests. In Filter Query, pick Priority Value on the left, choose is equal to, and type High on the right:

Filter array in basic mode with Priority Value is equal to High

Behind the scenes, basic mode writes this expression:

@equals(item()?['Priority']?['Value'], 'High')

Then I added a Compose action with length(body('Filter_High_priority')). In the run, it returned 206 of the 620 items:

Run history showing the Count High compose output of 206 after Filter array

How does this work?

Filter array checks each item in From, one at a time. item() is the current item, so item()?['Priority'] is its Priority column.

A Choice column comes through as an object, so you compare its Value. The same applies to lookup columns; for multi-select choices, see converting a multiple-choice column to a string.

Method 2: Filter Array With Multiple Conditions (Advanced Mode)

Basic mode in the Filter array action shows one condition row. For two or more, select Edit in advanced mode and write the expression yourself.

Say we need In Progress requests that were due in October 2026 and are already past due. Here’s the expression:

@and(equals(item()?['Status']?['Value'], 'In Progress'), greaterOrEquals(item()?['DueDate'], '2026-10-01'), less(item()?['DueDate'], utcNow()))
Code view of the Filter multiple conditions action with the and expression in the where property

On 10/18/2026, this returned 7 requests, starting with Software license #1271, Badge access #1274 and VPN access #1277.

How does this work?

and() takes two or more conditions and returns true only when all of them are true. You don’t need to nest one and() inside another.

SharePoint returns DueDate as an ISO 8601 string, such as 2026-10-09T12:00:00Z. Because utcNow() uses the same format, less() compares them correctly. That’s handy for retrieving list items in a date range.

Only one @ goes at the very start. If you’d rather click than type, the same AND logic in a Condition action is shown in multiple conditions in Power Automate.

Pro Tip: Build each piece in basic mode first, switch to advanced mode, copy what it wrote, and then wrap the pieces in and(). You’ll avoid most typos.

Method 3: Use OR Conditions

Use or() when an item should pass if any one test is true. Here’s a filter for requests from either Megan Bowen or Alex Wilber:

@or(equals(item()?['Requester'], 'Megan Bowen'), equals(item()?['Requester'], 'Alex Wilber'))

The run returned 156 items, 78 for each requester.

How does this work?

or() returns true as soon as one condition is true. You can mix both, for example @and(equals(...), or(equals(...), equals(...))), to say “this AND (that OR the other)”.

Method 4: Filter Array Contains (Case-Insensitive)

The contains operator keeps items whose text includes a word. It’s case-sensitive, so “printer” won’t match “Printer jam” on its own.

Here’s the fix. Wrap the column in toLower() and type the value in lowercase:

@contains(toLower(item()?['Title']), 'printer')
Filter array with toLower of Title contains printer in basic mode

This returned 52 requests, every one titled “Printer jam”.

How does this work?

toLower() turns “Printer jam #1003” into “printer jam #1003” before the test runs. For checking whether one value sits inside an array, see how to check if an array contains a value.

Method 5: Filter Array Against a Variable

When the allowed values change, keep them in an array variable instead of chaining or(). First, initialize a variable named varTeam of type Array with this value:

["Megan Bowen", "Alex Wilber"]

Then set the Filter Query to varTeam contains Requester. In advanced mode, it reads:

@contains(variables('varTeam'), item()?['Requester'])
Filter array with varTeam contains Requester and the Initialize varTeam action

The result was 156 items, the same as the OR filter in Method 3.

How does this work?

Here, contains() looks for the requester inside the array, so it works like an IN list. To add names while the flow runs, append values to an array variable before the Filter array step.

You can also filter a variable itself. Put variables('varTeam') in From and use item() alone, because each item is a plain string.

How to Use the Filter Array Output

Filter array returns an array in its Body output. Here are the four ways I use it most:

GoalExpression or action
Count the matcheslength(body('Filter_multiple_conditions'))
Get the first matchfirst(body('Filter_multiple_conditions'))?['Title']
Keep only some columnsSelect with From = Body
Act on each matchApply to each over Body

More counting patterns are in count items in an array. For the titles, add a Select action, set From to the Filter array Body, and map Title in text mode:

Select action mapping Title from the Filter array body output

Then a Compose turns the list into one line of text:

@{length(body('Filter_multiple_conditions'))} In Progress requests past due in October. First 3: @{join(take(body('Select_titles'), 3), ', ')}
Compose output listing 7 In Progress requests past due and the first three titles

How does this work?

Select changes the shape of each object but keeps the count, so it returned 7 titles. take() keeps the first 3, and join() turns them into a string. Our guide to convert an array to a string shows other separators.

Before you loop, it’s worth testing whether anything matched at all. Here’s how to check if an array is empty.

Why Is Power Automate Filter Array Not Working?

When a filter returns 0 items or too few, it’s usually one of these. I reproduced the first two in the same run.

  • Choice column without /Value. @equals(item()?['Priority'], 'High') returned 0 and no error, because it compared an object with text. Use item()?['Priority']?['Value'].
  • Get items stopped at 100. A second Get items with no Top Count read only 100 of 620 items, so the same High filter found 32 instead of 206.
  • Different case. Filter array text is case-sensitive. Use toLower() on both sides.
  • Numbers in quotes. Compare numbers without quotes, like greater(item()?['Amount'], 1000). Text numbers need int(); see convert a string to an integer.
  • Wrong From. From must be an array, such as body('Get_items')?['value'], not the whole Get items body.
Run history showing Get items default read 100 items and found 32 High requests

To read more than 5,000 items, turn on Pagination in the Get items settings or use REST API pagination in Power Automate.

Which Method Should You Use?

SituationUse
One column, one valueMethod 1, basic mode
All conditions must be trueMethod 2, and() in advanced mode
Any one condition is enoughMethod 3, or()
Text includes a wordMethod 4, contains() with toLower()
The allowed values changeMethod 5, an array variable

Pro Tip: If the data comes from SharePoint, filter at the source first with an OData filter query in Get items. It sends fewer items to the flow, so use Filter array for what OData can’t do, like toLower() or a variable list.

Things to Keep in Mind

  • Filter array never changes the shape of the items. Use Select after it.
  • Rename the action before you reference it. A rename later breaks expressions that use the old name.
  • Blank columns come through as null. Read them with ? so the filter doesn’t fail.
  • Compare dates in the same ISO format, or format both sides with formatDateTime() in Power Automate.

Here are more array and SharePoint flow guides worth reading next:

Frequently Asked Questions

What does Filter array do in Power Automate?

It takes an array in From, tests each item against your condition, and returns only the items that pass. It doesn’t change the shape of the items.

How do I use multiple conditions in Filter array?

Select Edit in advanced mode and wrap the tests in and() or or(), for example @and(equals(item()?[‘Status’]?[‘Value’], ‘In Progress’), less(item()?[‘DueDate’], utcNow())). Put only one @ at the start.

Is Filter array contains case-sensitive?

Yes. Wrap the column in toLower() and type the value in lowercase, for example @contains(toLower(item()?[‘Title’]), ‘printer’).

How do I get the count or first item from the Filter array output?

Use length(body(‘Filter_array’)) for the count and first(body(‘Filter_array’)) for the first item. Replace Filter_array with your action name, using underscores for spaces.

Where can I read Microsoft’s documentation on Filter array?

Microsoft covers Filter array, Select and Join in Use data operations in Power Automate on Microsoft Learn.