我在表格中有以下数据:
+----------------------+----------------------------------------------------------+--------------+
| 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的所有行,但不是。
答案 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%';
希望它有效。