Muhammad Taqi
Muhammad Taqi

Reputation: 5424

SQL query to match one of multiple strings

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

Answers (5)

Erwin Brandstetter
Erwin Brandstetter

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

Mironek
Mironek

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

Mario Leonel
Mario Leonel

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

benscabbia
benscabbia

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

BabyDuck
BabyDuck

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

Related Questions