postgresql 要匹配多个字符串之一的SQL查询

wtlkbnrh  于 2023-05-17  发布在  PostgreSQL
关注(0)|答案(5)|浏览(201)

我在表中有以下数据:

+----------------------+----------------------------------------------------------+--------------+
| 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、海尔布尔或卡拉奇的所有行。

frebpwbc

frebpwbc1#

对于一个合适的解决方案,要么normalize your database design,要么考虑full text search
要快速解决手头的问题,请使用正则表达式匹配(~)或三个简单的LIKE表达式:

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

或者:

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

或者使用~*ILIKE进行不区分大小写的匹配。
因为另一个答案暗示了这一点:never use SIMILAR TO

kuuvgm7e

kuuvgm7e2#

您可以使用以下命令:

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

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

6ie5vjzr

6ie5vjzr3#

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

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

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

nxagd54h

nxagd54h4#

在MySQL中尝试使用正则表达式“REGEXP”和运算符|它的工作原理类似于OR:

SELECT * FROM subscriberfields  WHERE  name REGEXP 'Khairpur|Islamabad|Karachi';

因此,您将获得至少包含这些单词中的一个的结果。
或者,如果您想要包含所有单词的结果,请用途:

SELECT * FROM subscriberfields  WHERE  name REGEXP '(?=.*Khairpur)(?=.*Islamabad)(?=.*Karachi)';

在服务器版本10 MariaDB和PHP 8上使用MySQL
如果您想了解更多关于REGEXP的信息,请尝试:
https://www.geeksforgeeks.org/mysql-regular-expressions-regexp/https://www.freecodecamp.org/news/sql-contains-string-sql-regex-example-query/
有很多博客都提供了REGEXP示例,但并不是每个人都能给予您可以使用的所有模式和值,但对于初学者来说,请看看这些。

23c0lvtd

23c0lvtd5#

在WHERE子句中使用OR,例如,

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

希望能成功。

相关问题