web-dev-qa-db-ja.com

複数の文字列の1つに一致するSQLクエリ

表に次のデータがあります。

+----------------------+----------------------------------------------------------+--------------+
| 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 |
+----------------------+-----------------------------------------------+--------------+

名前にイスラマバード、ハイルプル、カラチが含まれるすべての行が返されるはずですが、そうではありません。

9
Muhammad Taqi

適切な解決策については、 データベース設計を正規化する 、またはそれを除いて 全文検索 のいずれかを検討してください。

手元の問題をすばやく解決するには、 正規表現の一致(~ または3つの単純な LIKE 式を使用します。

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

または:

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

または、大文字と小文字を区別しない照合には~*またはILIKEを使用します。

別の答えがそれを示唆したので:neveruse SIMILAR TO

13

以下のようにSIMILAR TOを使用してみてください。

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

また、データベースの正規化についても読む必要があります。あなたのデザインは間違いなく改善される可能性があり、改善されるべきです。

3
benscabbia

あなたはこれを使うことができます:

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

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

2
Mario Leonel