> For the complete documentation index, see [llms.txt](https://olivers-expression-lab.gitbook.io/filter-expressions-in-fme/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://olivers-expression-lab.gitbook.io/filter-expressions-in-fme/comparison-operators.md).

# Comparison Operators

Remember [Introduction](/filter-expressions-in-fme/introduction.md), where I compared **XML Filter Expressions** with **SQL**.

Investigating WFS capabilities in [GetCapabilities](/filter-expressions-in-fme/getcapabilities.md) shows us, which comparison operations are supported by the WFS, e.g.

```xml
<fes:ComparisonOperators>
   <fes:ComparisonOperator name="PropertyIsEqualTo"/>
   <fes:ComparisonOperator name="PropertyIsNotEqualTo"/>
   <fes:ComparisonOperator name="PropertyIsLessThan"/>
   <fes:ComparisonOperator name="PropertyIsGreaterThan"/>
   <fes:ComparisonOperator name="PropertyIsLessThanOrEqualTo"/>
   <fes:ComparisonOperator name="PropertyIsGreaterThanOrEqualTo"/>
   <fes:ComparisonOperator name="PropertyIsLike"/>
   <fes:ComparisonOperator name="PropertyIsNull"/>
   <fes:ComparisonOperator name="PropertyIsNil"/>
   <fes:ComparisonOperator name="PropertyIsBetween"/>
</fes:ComparisonOperators>
```

Now, we will have a look at some **Comparison Operators.** As they are easy to understand, we look only at a small selection.&#x20;

To do so, we will use our traffic meter WFS again. &#x20;

| Parameter      | Value                                         |
| -------------- | --------------------------------------------- |
| WFS URL        | <https://www.wfs.nrw.de/wfs/strassen_nrw?>    |
| Version        | 2.0.0                                         |
| Features Types | **Zaehlstellen** (*counting points*)          |
| Max Features   | leave blank                                   |
| xmlns          | ms="<http://mapserver.gis.umn.edu/mapserver>" |

## PropertyIsEqualTo

To recap, remember the Filter Expression we already used

```xml
<fes:Filter 
   xmlns:fes="http://www.opengis.net/fes/2.0"
   xmlns:ms="http://mapserver.gis.umn.edu/mapserver">
   <fes:PropertyIsEqualTo>
      <fes:ValueReference>ms:ZSTNR</fes:ValueReference>
      <fes:Literal>52082215</fes:Literal>
   </fes:PropertyIsEqualTo>
</fes:Filter>
```

PropertyIsEqualTo works similar to the equal operator ("=") in SQL.

Any feature which **exactly matches** the Filter Expresssion is returned.

## PropertyIsBetween

PropertyIsBetween defines a **range of values for 1 attribute** by a

1. LowerBoundary
2. UpperBoundary

```xml
<fes:Filter
	xmlns:fes="http://www.opengis.net/fes/2.0"
	xmlns:ms="http://mapserver.gis.umn.edu/mapserver">
	<fes:PropertyIsBetween>
		<fes:ValueReference>ms:ZSTNR</fes:ValueReference>
		<fes:LowerBoundary><fes:Literal>39000000</fes:Literal></fes:LowerBoundary>
		<fes:UpperBoundary><fes:Literal>40000000</fes:Literal></fes:UpperBoundary>
	</fes:PropertyIsBetween>
</fes:Filter>
```

As our traffic meter WFS uses ascending integers for the counting point number (ZSTNR), we are able to cut out a piece like this

<figure><img src="/files/ALYPsGAN7W6oayxyLhvY" alt=""><figcaption></figcaption></figure>

## PropertyIsLike - Wildcards

**Wildcards** are really useful! The PropertyIs**Like** operator allows you to do pattern matching.

In our traffic meter WFS the attribute "ERFASSART" describes the type of traffic meter in combination with year dates, e.g. "2017".

Let's select all traffic meters containing "2017" in ERFASSART, no matter of the position within the description.

```xml
<fes:Filter 
   xmlns:fes="http://www.opengis.net/fes/2.0"
   xmlns:ms="http://mapserver.gis.umn.edu/mapserver">
   <fes:PropertyIsLike wildCard='*' singleChar='.' escapeChar='!'>
      <fes:ValueReference>ms:ERFASSART</fes:ValueReference>
      <fes:Literal>*2017*</fes:Literal>
   </fes:PropertyIsLike>
</fes:Filter>
```

<figure><img src="/files/TeLifEmbDKmxi73fjQfF" alt=""><figcaption></figcaption></figure>

Let's try another example. This time parking decks in Hamburg.

| Key            | Value                                                                  |
| -------------- | ---------------------------------------------------------------------- |
| WFS URL        | <https://qs-geodienste.hamburg.de/HH_WFS_Verkehr_opendata?SERVICE=WFS> |
| Version        | 2.0.0                                                                  |
| Features Types | verkehr\_parkhaeuser (parking decks)                                   |
| Max Features   | leave blank                                                            |
| xmlns          | de.hh.up="<https://registry.gdi-de.org/id/de.hh.up>"                   |
|                | <p>preise (de) = fees (en)<br>kostenlos (de) = free of charge (de)</p> |

We want to select only those parking decks with no fees at least for the first 30 minutes.

```xml
<fes:Filter
	xmlns:fes="http://www.opengis.net/fes/2.0"
	xmlns:de.hh.up="https://registry.gdi-de.org/id/de.hh.up">
	<fes:PropertyIsLike wildCard='*' singleChar='.' escapeChar='!'>
		<fes:ValueReference>de.hh.up:preise</fes:ValueReference>
		<fes:Literal>*kostenlos*</fes:Literal>
	</fes:PropertyIsLike>
</fes:Filter>
```

<figure><img src="/files/JJfoiLrM5xIjNfISxME1" alt=""><figcaption></figcaption></figure>

## Umlauts

If you struggle with umlauts (ÄÖÜäöüß) in Comparison Operators, please try wildcards (PropertyIsLike) instead!
