有几种选择:
1) 构建一系列ORed 表达式,例如:
SELECT t.* from mytable t WHERE t.name LIKE '%val1%' or t.name LIKE '%val2%'...
2) 使用 find_in_set :可能比组合使用 LIKEs 更有效
SELECT t.* from mytable t WHERE find_in_set(t.name, 'val1,val2,...')
3) 使用正则表达式:与find_in_set 的速度顺序相同
SELECT t.* from mytable t WHERE t.name REGEXP 'val1|val2|...';
4) 如果您有一个非常大的值列表,您的查询会变慢,并且您最终会在表示该列表的表达式中达到 varchar 的最大大小。我建议将它们填充到数据库表中,并使用带有相关子查询的 WHERE EXIST 条件:
SELECT t.*
FROM mytable t
WHERE EXISTS (SELECT 1 from mylist where t.name like CONCAT('%', l.val '%'))
5) 使用 MySQL 8.0,可以模拟列表表with a CTE:
WITH mylist AS (
SELECT '%val1%' UNION SELECT '%val2%' UNION ...)
)
SELECT t.*
FROM mytable t
WHERE EXISTS (SELECT 1 from mylist where t.name like CONCAT('%', l.val '%'))