# Filtering Data

Apply precise filters to find exactly the records you need with type-aware filter operators.

## Overview

Simpl's filter system understands your column types and offers appropriate operators for each. Filter by text, numbers, dates, booleans, arrays, and more.

## Opening the Filter Panel

Click the **Filter** button in the toolbar above the list view to open the filter panel.

## Adding Filters

### Step 1: Select a Column

Choose which column to filter from the dropdown. All columns from your table are available.

### Step 2: Choose an Operator

Available operators depend on the column type (see [Filter Operators](/content/docs/features/filtering#filter-operators/index.html) below).

### Step 3: Enter a Value

Provide the value(s) to filter by. Input type matches the column type (text input, date picker, number input, etc.).

### Step 4: Apply

Click **Apply** or press Enter. The list view immediately updates to show matching records.

## Filter Operators

### Text Filters

| Operator      | Description                       | Example                          |
|---------------|-----------------------------------|----------------------------------|
| equals        | Exact match                       | "John Smith"                    |
| contains      | Substring match                   | "smith" matches "Goldsmith"  |
| starts with   | Begins with value                 | "inv-" matches "inv-001"     |
| ends with     | Ends with value                   | "@gmail.com"                   |
| is empty      | Field is null or empty string     | -                                |
| is not empty  | Field has a value                 | -                                |

### Number Filters

| Operator      | Description                       | Example                          |
|---------------|-----------------------------------|----------------------------------|
| equals        | Exact match                       | 100                              |
| greater than  | Value > filter                    | > 50                             |
| less than     | Value < filter                    | < 1000                           |
| greater than or equal | Value >= filter            | >= 0                             |
| less than or equal | Value <= filter              | <= 99                            |
| between       | Value in range                   | 10 to 100                       |
| is empty      | Field is null                    | -                                |
| is not empty  | Field has a value                | -                                |

### Date Filters

| Operator      | Description                       | Example                          |
|---------------|-----------------------------------|----------------------------------|
| is            | Exact date match                 | 2024-01-15                       |
| is after      | Date > filter                     | After Jan 1, 2024                |
| is before     | Date < filter                     | Before Dec 31, 2023              |
| is between     | Date in range                    | Jan 1 to Mar 31                  |
| is empty      | No date set                      | -                                |
| is not empty  | Date is set                      | -                                |

### Boolean Filters

| Operator      | Description                       |
|---------------|-----------------------------------|
| is true      | Field equals true                 |
| is false     | Field equals false                |
| is null      | Field is null                     |
| is not null  | Field has a boolean value         |

### Enum Filters

For PostgreSQL enum columns, you'll see a dropdown with all possible values:

| Operator      | Description                       |
|---------------|-----------------------------------|
| is           | Equals the selected value         |
| is not       | Does not equal the selected value  |
| is empty      | Field is null                    |
| is not empty  | Field has a value                |

### Array Filters

| Operator      | Description                       | Example                          |
|---------------|-----------------------------------|----------------------------------|
| contains      | Array includes value              | ["a","b"] contains "a"      |
| is empty      | Array is null or empty           | []                               |
| is not empty  | Array has elements                | -                                |
| length equals | Array has N elements             | length = 3                      |
| length greater than | Array has more than N elements | length > 5                      |
| length less than | Array has fewer than N elements | length < 10                     |

### UUID & JSON Filters

| Operator      | Description                       |
|---------------|-----------------------------------|
| equals        | Exact match                       |
| starts with   | Begins with value                 |
| is empty      | Field is null                    |
| is not empty  | Field has a value                |

## Multiple Filters

### Adding Multiple Conditions

Click **Add Filter** to add additional conditions. Each filter narrows your results further.

### AND Logic

Multiple filters are combined with AND logic:

- Filter 1: `status = active`
- Filter 2: `created_at > 2024-01-01`
- Result: Records that are **both** active AND created after Jan 1, 2024

### Removing Filters

Click the **X** button on any filter chip to remove it.

### Clearing All Filters

Click **Clear All** in the filter panel to remove all active filters at once.

## Filter URL State

Your filters are saved in the URL, which means:

- **Shareable links** - Copy the URL to share a filtered view with others
- **Browser history** - Use back/forward to navigate filter states
- **Bookmarks** - Save commonly-used filter combinations

Example URL with filters:

```
/dashboard/c/abc123/users?filters=status:eq:active,created_at:gt:2024-01-01
```

## Combining with Search

Filters and search work together seamlessly:

1. Apply filters to narrow your dataset
2. Use search to find specific records within filtered results
3. Both conditions must match for records to appear

This is powerful for scenarios like:

- "Find all active users whose name contains 'smith'"
- "Search invoices over $1000 for 'overdue'"

## Best Practices

### Start Broad, Then Narrow

Begin with one or two filters, then add more as needed. This helps you understand your data distribution.

### Use Empty/Not Empty

The "is empty" and "is not empty" operators are useful for:

- Finding incomplete records
- Auditing data quality
- Filtering out nulls

### Date Ranges

For time-based analysis:

- Use "between" for specific periods
- Use "is after" for recent records
- Combine with sorting for chronological views

## Next Steps

- [Sort your filtered results](/content/docs/features/sorting/index.html)
- [Customize which columns appear](/content/docs/features/layouts/index.html)
- [Export filtered data](/content/docs/features/export/index.html)
