# A MySQL plugin that filters rows by meaning (built on TypeSafe Jev)

> Source: <https://github.com/maayanlevy/mysql-ailike>
> Published: 2026-09-20 11:04:51+00:00

A native MySQL plugin for filtering rows and comparing text columns with
natural-language conditions, powered by [TypeSafe Jev](https://docs.typesafe.ai).

[Install and check compatibility](https://github.com/maayanlevy/mysql-ailike/blob/main/docs/install.md) · [Try the Docker demo](https://github.com/maayanlevy/mysql-ailike/blob/main/docs/sample-data.md#run-the-local-demo)

Preview release. Requires a TypeSafe API key. Note: evaluated values and prompts are sent to TypeSafe.

Find columns based on NL meaning:

```
SELECT film_id, title, description
FROM sakila.film
WHERE film_id BETWEEN 1 AND 8
  AND description AILIKE 'The story takes place somewhere in Asia';
```

| Syntax | Question | 
|---|---|
| `column AILIKE 'condition'` | Does this value satisfy the condition? | 
| `ailike(value, prompt)` | Does this value satisfy the condition? | 
| `ailike(left, right, prompt)` | Do these values satisfy the relationship? | 

AILIKE returns `1` for a match and `0` otherwise. Any `NULL` argument returns
`NULL`. Arguments are string. use `CAST(... AS CHAR)` for other types.

Narrow candidates with ordinary SQL conditions: each uncached evaluation makes an API request.

The [demo dataset](https://github.com/maayanlevy/mysql-ailike/blob/main/sql/join-demo.sql) contains three supplier products and three
catalog products. With AILIKE installed, open `mysql -u root -p` from the repository
root and load it into a fresh database:

```
CREATE DATABASE ailike_join_demo;
USE ailike_join_demo;
SOURCE sql/join-demo.sql;
```

Pass both columns and describe the relationship:

```
SELECT a.id AS supplier_id, a.description AS supplier,
       b.id AS catalog_id, b.description AS catalog
FROM supplier_products AS a
JOIN catalog_products AS b
  ON a.category_id = b.category_id
 AND ailike(
   a.description,
   b.description,
   'Left and right describe the same kind of product, '
   'with matching material and key features. Wording may differ.'
 )
ORDER BY a.id, b.id;
```

Expected matches: `(1, 1)` for the steel bottle and vacuum flask, and `(3, 3)` for
the headphones. The glass carafe and plastic bottle have no matching pair.

## Format-independent date/period match

```
SELECT rental_id, rental_date
FROM sakila.rental
WHERE customer_id = 1
  AND ailike(CAST(rental_date AS CHAR),
             'In July 2005')
ORDER BY rental_id;
```

AILIKE returns a model judgment. Use SQL date functions for exact comparisons.

[Contributing](https://github.com/maayanlevy/mysql-ailike/blob/main/CONTRIBUTING.md) · [Report a vulnerability](https://github.com/maayanlevy/mysql-ailike/blob/main/SECURITY.md) ·
[AI coding agent skill](https://github.com/maayanlevy/mysql-ailike/blob/main/skills/mysql-ailike/SKILL.md) · [GPL-2.0-only](https://github.com/maayanlevy/mysql-ailike/blob/main/LICENSE)
