Reputation: 5424
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.
Upvotes: 13
Views: 45589
Reputation: 656734
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 simple LIKE
expressions:
SELECT *
FROM subscriberfields
WHERE name ~ '(Khairpur|Islamabad|Karachi)';
Or:
WHERE (name LIKE '%Khairpur%'
OR name LIKE '%Islamabad%'
OR name LIKE '%Karachi%')
.. which can be compressed like Mario demonstrates in his answer. Or shorter, yet, with an array literal:
WHERE name LIKE ANY ('{%Khairpur%, %Islamabad%, %Karachi%}');
But the regexp match gets the same query plan in modern Postgres (can use the same trigram index) and is shorter, yet. See:
Or use ~*
or ILIKE
for case-insensitive matching.
Since another answer suggested it: never use SIMILAR TO
:
Upvotes: 26
Reputation: 11
In MySQL try using a regular expression "REGEXP" and operator | which works like OR:
SELECT * FROM subscriberfields WHERE name REGEXP 'Khairpur|Islamabad|Karachi';
so you will get results containing at least one of these words.
Alternatively, if you want results that will include ALL words, use:
SELECT * FROM subscriberfields WHERE name REGEXP '(?=.*Khairpur)(?=.*Islamabad)(?=.*Karachi)';
Works with MySQL on server version 10 MariaDB and PHP 8
If you want to learn more about REGEXP try:
https://www.geeksforgeeks.org/mysql-regular-expressions-regexp/ https://www.freecodecamp.org/news/sql-contains-string-sql-regex-example-query/
There are many blogs with REGEXP examples, but not everyone will give you all the patterns and values you can use, but for starters, have a look at these.
Upvotes: 0
Reputation: 51
You can use this:
select * from subscriberfields
where name like any(array['%Khairpur%','%Islamabad%','%Karachi%']);
https://postgres.cz/wiki/PostgreSQL_SQL_Tricks#LIKE_to_list_of_patterns
Upvotes: 5
Reputation: 18072
Try using SIMILAR TO
like below:
SELECT * FROM subscriberfields
WHERE name SIMILAR TO '%(Khairpur|Islamabad|Karachi)%';
Also you should read up on database normalization. Your design could and should definitely be improved.
Upvotes: 3
Reputation: 1249
Use OR in WHERE clause, like,
select * from subscriberfields where name like '%Khairpur%' OR name like '%Islamabad%' OR name like '%Karachi%';
Hope it works.
Upvotes: -1