我有一个查询,我需要在近2000个字符串上运行,能够像使用" IN"那样做一个列表非常有帮助。运算符,但使用LIKE比较操作。
例如,我想查看pet_name是否与其中任何一个(但不完全相同):barfy,max,whiskers,champ,big-D,Big D,Sally
使用它不会区分大小写,也可以使用下划线而不是短划线。还是一个空间。编写大量OR运算符将是一个巨大的痛苦。我在MySQL 5.1上运行它。
在我的特定情况下,我正在寻找文件名,其中差异通常是破折号或下划线,相反的情况。
答案 0 :(得分:9)
对于这项任务,我建议像这样使用RegExp capabilities in MySQL:
select * from EMP where name RLIKE 'jo|ith|der';
这是不区分大小写的匹配,将从多个like / OR条件中保存。
答案 1 :(得分:4)
你可以这样做 -
SELECT FIND_IN_SET(
'bigD',
REPLACE(REPLACE('barfy,max,whiskers,champ,big-D,Big D,Sally', '-', ''), ' ', '')
) has_petname;
+-------------+
| has_petname |
+-------------+
| 5 |
+-------------+
如果有我们正在寻找的pet_name,它将给出一个非零值(> 0)。
但我建议您创建一个表petnames
并使用SOUNDS LIKE函数来比较名称,在这种情况下,'bigD'将等于'big-D',例如:
SELECT 'bigD' SOUNDS LIKE 'big-D';
+---------------------------+
| 'bigD'SOUNDS LIKE 'big-D' |
+---------------------------+
| 1 |
+---------------------------+
示例:
CREATE TABLE petnames(name VARCHAR(40));
INSERT INTO petnames VALUES
('barfy'),('max'),('whiskers'),('champ'),('big-D'),('Big D'),('Sally');
SELECT name FROM petnames WHERE 'bigD' SOUNDS LIKE name;
+-------+
| name |
+-------+
| big-D |
| Big D |
+-------+
答案 2 :(得分:1)
首先,将所有静态值放在任何临时表中,这将是查找字典。
SELECT * FROM Table t
WHERE EXISTS (
SELECT *
FROM LookupTable l
WHERE t.PetName LIKE '%' + l.Value + '%'
)
答案 3 :(得分:0)
配置包含这些2000值的列以进行全文搜索。然后您可以使用MySQL的全文搜索功能。请参阅他们的docs
答案 4 :(得分:0)
您可以使用REGEXP。它对我来说就像一个魅力
pet_name regexp'barfy | max | whiskers | champ | you name it'