A sample. Searching for at least one common word between value and criteria.
-- sample data
CREATE TABLE users (id INT, name VARCHAR(100));
INSERT INTO users VALUES
( 1 , 'Elizabeth Smith'),
( 2 , 'Smith Elizabeth'),
( 3 , 'Elizabeth Smith'),
( 4 , 'Dr.Elizabeth Smith'),
( 5 , 'DR. Smith Elizabeth'),
( 6 , 'DR. John Silver');
-- add a column with normalized value
-- you may use (stored) generated column also
ALTER TABLE users
ADD COLUMN norm_name JSON;
UPDATE users
SET norm_name = CONCAT('["', REGEXP_REPLACE(name, '[., ]+', '","'), '"]');
SELECT id, name, CAST(norm_name AS CHAR) norm_name FROM users;
| id |
name |
norm_name |
| 1 |
Elizabeth Smith |
["Elizabeth", "Smith"] |
| 2 |
Smith Elizabeth |
["Smith", "Elizabeth"] |
| 3 |
Elizabeth Smith |
["Elizabeth", "Smith"] |
| 4 |
Dr.Elizabeth Smith |
["Dr", "Elizabeth", "Smith"] |
| 5 |
DR. Smith Elizabeth |
["DR", "Smith", "Elizabeth"] |
| 6 |
DR. John Silver |
["DR", "John", "Silver"] |
SET @search_criteria = 'Elizabeth Smith';
SELECT id, name, CAST(norm_name AS CHAR) norm_name
, CONCAT('["', REGEXP_REPLACE(@search_criteria, '[., ]+', '","'), '"]') norm_criteria
, JSON_OVERLAPS(norm_name, CONCAT('["', REGEXP_REPLACE(@search_criteria, '[., ]+', '","'), '"]')) matching
FROM users;
| id |
name |
norm_name |
norm_criteria |
matching |
| 1 |
Elizabeth Smith |
["Elizabeth", "Smith"] |
["Elizabeth","Smith"] |
1 |
| 2 |
Smith Elizabeth |
["Smith", "Elizabeth"] |
["Elizabeth","Smith"] |
1 |
| 3 |
Elizabeth Smith |
["Elizabeth", "Smith"] |
["Elizabeth","Smith"] |
1 |
| 4 |
Dr.Elizabeth Smith |
["Dr", "Elizabeth", "Smith"] |
["Elizabeth","Smith"] |
1 |
| 5 |
DR. Smith Elizabeth |
["DR", "Smith", "Elizabeth"] |
["Elizabeth","Smith"] |
1 |
| 6 |
DR. John Silver |
["DR", "John", "Silver"] |
["Elizabeth","Smith"] |
0 |
SET @search_criteria = 'Dr. Silver';
SELECT id, name, CAST(norm_name AS CHAR) norm_name
, CONCAT('["', REGEXP_REPLACE(@search_criteria, '[., ]+', '","'), '"]') norm_criteria
, JSON_OVERLAPS(norm_name, CONCAT('["', REGEXP_REPLACE(@search_criteria, '[., ]+', '","'), '"]')) matching
FROM users;
| id |
name |
norm_name |
norm_criteria |
matching |
| 1 |
Elizabeth Smith |
["Elizabeth", "Smith"] |
["Dr","Silver"] |
0 |
| 2 |
Smith Elizabeth |
["Smith", "Elizabeth"] |
["Dr","Silver"] |
0 |
| 3 |
Elizabeth Smith |
["Elizabeth", "Smith"] |
["Dr","Silver"] |
0 |
| 4 |
Dr.Elizabeth Smith |
["Dr", "Elizabeth", "Smith"] |
["Dr","Silver"] |
1 |
| 5 |
DR. Smith Elizabeth |
["DR", "Smith", "Elizabeth"] |
["Dr","Silver"] |
0 |
| 6 |
DR. John Silver |
["DR", "John", "Silver"] |
["Dr","Silver"] |
1 |
fiddle
Pay attention - the comparing is case-sensitive! If you need in case non-sensitivity then uppercase or lowercase both values and criteria.
WHERE MATCH(name) AGAINST(...) AND {some LIKE or RLIKE}. That will first do aFULLTEXT`, then further filter those results. FTS will ignore the spaces.