The `$filter` system query option states the condition the rows have to meet. The condition is passed on to the platform, so the rows which do not meet it are never retrieved. ## A Single Comparison ```text GET .../odata4/ExactOnlineREST.Financial.GLAccountsBulk@eol?$filter=Division eq 920474 ``` Text values are written between single quotes, and a quote inside the value is doubled: ```text GET .../odata4/ExactOnlineREST.Financial.GLAccountsBulk@eol?$filter=Code eq '0110' ``` ## Several Conditions Conditions are combined with `and` and `or`, and brackets settle the order: ```text GET .../odata4/ExactOnlineREST.Financial.GLAccountsBulk@eol?$filter=Division eq 920474 and (Code eq '0110' or Code eq '0120') ``` ## A Set of Values The `in` operator asks for a set of values on one column: ```text GET .../odata4/ExactOnlineREST.Financial.GLAccountsBulk@eol?$filter=Code in ('0110','0120','0130') ``` The same set written as a chain of alternatives, `Code eq '0110' or Code eq '0120' or ...`, is turned into this form as well, so both shapes reach the platform as one list. That matters on a platform which refuses a deeply nested condition, which several do beyond roughly fourteen alternatives. The mirror image works too. Excluding values of one column with `DivisionName ne 'ACME BV' and DivisionName ne 'ACME Holding BV'` becomes a single exclusion list. ## Part of a Text Four functions look inside a text: ```text GET .../odata4/ExactOnlineREST.Financial.GLAccountsBulk@eol?$filter=startswith(Code,'01') ``` `contains`, `startswith` and `endswith` become a pattern comparison, in which the per cent sign stands for any number of characters and the underscore for exactly one. A searched value holding either of them therefore matches more than it appears to: `contains(Code,'1_0')` also finds `100` and `140`. ## What Cannot Be Filtered The operators and functions which are read are listed in full in [[Supported OData 4 Features]]. Two limits are worth remembering while writing a filter: - `not`, `mod`, `has`, `any`, `all`, `cast` and `isof` are not read; - a function which is not read is not always refused. The condition may be dropped from the query instead, and the answer then holds more rows than were asked for. So a filter is written with the four documented functions only. ## Combining A filter and a grouping do not sit side by side. Where rows have to be dropped before they are grouped, the condition moves inside the `$apply`; see [[Group and Aggregate Rows]].