> For the complete documentation index, see [llms.txt](https://docs.decube.io/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.decube.io/data-quality-v2/monitor-types/field-health/value-set-checks.md).

# Value Set Checks

Value in Set and Value Not In Set tests.

Two variants: check whether the value in a column belongs to, or doesn't belong to, a defined set of acceptable values. These apply to string-type columns.

* **Value In** — a row fails if its value is not in the configured set. Use this to enforce an allowed list.
* **Value Not In** — a row fails if its value is in the configured set. Use this to block specific known-bad values.

### When to use it <a href="#when-to-use-it" id="when-to-use-it"></a>

* **Value In** — A business expects a `country` column to only contain "US", "CA", "MX". A Value In check using this set flags any value outside it.
* **Value Not In** — A signup form allows free-text entry, and upstream systems occasionally write placeholder values like "N/A", "UNKNOWN", "TBD" into the `country` column. A daily Value Not In check using this set catches any newly ingested row carrying a placeholder.

### What's configurable <a href="#whats-configurable" id="whats-configurable"></a>

* **Schedule** — fixed recurring, or Manual (requires Full Table Scan if Manual).
* **Scan Method** — Full Table Scan or Incremental Scan.
* **Values** — the set of values to check against. There's no separate Threshold field — the value set alone determines whether a row passes or fails.
* **Tolerance** (optional) — how many, or what percentage of, failing rows are allowed.

<figure><img src="https://1779874722-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FTw0qpCVzfrIXqS4FEg4T%2Fuploads%2FwBLZnm6skAgoXMOJ4n7A%2Fimage-20260812-021745.png?alt=media&amp;token=49ac9172-edf8-423a-94a7-e9b9c3cd4dad" alt=""><figcaption></figcaption></figure>

### Worked example — Value In <a href="#worked-example-value-in" id="worked-example-value-in"></a>

* Asset: `users` table, column `country`
* Values: US, CA, MX
* Tolerance: not set

**Resulting rule:** "An incident will be created when any row fails." (A row fails here when its value is not one of US, CA, or MX.)

### Worked example — Value Not In <a href="#worked-example-value-not-in" id="worked-example-value-not-in"></a>

* Asset: `users` table, column `country`
* Values: N/A, UNKNOWN, TBD
* Schedule: Daily
* Tolerance: Absolute — 10

**Resulting rule:** "An incident will be created when more than 10 rows fail." (A row fails here when its value is one of the placeholder values.)

### Notes <a href="#notes" id="notes"></a>

* Changing the schedule or scan method later is a destructive change (it creates a new monitor version).
* Changing the list of values is also treated as destructive, since it redefines what a passing row looks like — even though it might feel like a minor tweak. Adjusting only the tolerance value is not destructive.
