I have following data in table:
+----------------------+----------------------------------------------------------+--------------+
| 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 |
+----------------------+----------------------------------------------------------+--------------+
My query is:
select * from subscriberfields
where name like '%Khairpur,Islamabad,Karachi%';
Result:
+----------------------+-----------------------------------------------+--------------+
| 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 |
+----------------------+-----------------------------------------------+--------------+
It should return all rows where the name includes Islamabad, Khairpur or Karachi but it is not.
For a proper solution, either normalize your database design or, barring that, consider full text search.
For a quick solution to the problem at hand, use a regular expression match (
~
) or three simpleLIKE
expressions:Or:
Or use
~*
orILIKE
for case-insensitive matching.Since another answer suggested it: never use
SIMILAR TO
:Use OR in WHERE clause, like,
Hope it works.
You can use this:
https://postgres.cz/wiki/PostgreSQL_SQL_Tricks#LIKE_to_list_of_patterns
Try using
SIMILAR TO
like below:Also you should read up on database normalization. Your design could and should definitely be improved.