用于匹配多个字符串之一的SQL查询

时间:2015-03-09 09:43:40

标签: sql postgresql pattern-matching sql-like

我在表格中有以下数据:

+----------------------+----------------------------------------------------------+--------------+
| subscriber_fields_id | name                                                     | field_type   |
+----------------------+----------------------------------------------------------+--------------+
|                  143 | Peshawar/Islamabad/Lahore/Swat/Mardan/Karachi            | Job Location |
|                  146 | Karachi                                                  | Job Location |
|                  147 | Lahore and Karachi                                       | Job Location |
|                  149 | Karachi, Mirpur Khas, Sukkur, Layyah, Gilgit, Charsaddah | Job Location |
|                  152 | Islamabad or Lahore                                      | Job Location |
|                  155 | Islamabad                                                | Job Location |
|                  157 | 7 Districts of Sindh and Karachi                         | Job Location |
+----------------------+----------------------------------------------------------+--------------+

我的查询是:

select * from subscriberfields
where  name like '%Khairpur,Islamabad,Karachi%';

结果:

+----------------------+-----------------------------------------------+--------------+
| subscriber_fields_id | name                                          | field_type   |
+----------------------+-----------------------------------------------+--------------+
|                  143 | Peshawar/Islamabad/Lahore/Swat/Mardan/Karachi | Job Location |
|                  152 | Islamabad or Lahore                           | Job Location |
|                  155 | Islamabad                                     | Job Location |
+----------------------+-----------------------------------------------+--------------+

它应该返回名称中包含Islamabad,Khairpur或Karachi的所有行,但不是。

4 个答案:

答案 0 :(得分:12)

要获得正确的解决方案,normalize your database design或者除此之外,请考虑full text search

要快速解决当前问题,请使用regular expression match (~)或三个简单的LIKE表达式:

SELECT *
FROM   subscriberfields 
WHERE  name ~ '(Khairpur|Islamabad|Karachi)';

或者:

...
WHERE (name LIKE '%Khairpur%' OR
       name LIKE '%Islamabad%' OR
       name LIKE '%Karachi%')

或使用~*ILIKE进行不区分大小写的匹配。

由于另一个答案提示:从不使用SIMILAR TO

答案 1 :(得分:3)

尝试使用SIMILAR TO,如下所示:

SELECT * FROM subscriberfields 
WHERE name SIMILAR TO '%(Khairpur|Islamabad|Karachi)%';

此外,您应该阅读数据库规范化。您的设计可以而且绝对应该得到改进。

答案 2 :(得分:1)

您可以使用此:

select * from subscriberfields
where  name like any(array['%Khairpur%','%Islamabad%','%Karachi%']);

https://postgres.cz/wiki/PostgreSQL_SQL_Tricks#LIKE_to_list_of_patterns

答案 3 :(得分:-1)

在WHERE子句中使用OR,比如

select * from subscriberfields where name like '%Khairpur%' OR name like '%Islamabad%' OR name like '%Karachi%';

希望它有效。