Requête SQL pour correspondre à l'un de plusieurs chaînes de caractères
J'ai les données suivantes dans le tableau:
+----------------------+----------------------------------------------------------+--------------+
| 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 |
+----------------------+----------------------------------------------------------+--------------+
Ma requête est:
select * from subscriberfields
where name like '%Khairpur,Islamabad,Karachi%';
Résultat:
+----------------------+-----------------------------------------------+--------------+
| 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 |
+----------------------+-----------------------------------------------+--------------+
Il doit retourner toutes les lignes dont le nom comprend Islamabad, Khairpur ou Karachi, mais il ne l'est pas.
Vous souhaitez
Avez-vous essayé
Jamais utiliser
WHERE name LIKE '%Khairpur%' OR name LIKE ...
. Cependant, il n'est pas sargable et il faudra donc un full table scan, il deviendra désespérément inefficace que la taille de la table augmente. Vous devriez envisager d'utiliser recherche fulltext à la place.Avez-vous essayé
SIMILAR TO
comme je l'ai suggéré dans la réponse?Jamais utiliser
SIMILAR TO
, il est tout à fait inutile, la construction il y a toujours une meilleure option. J'ai ajouté une réponse.OriginalL'auteur Muhammad Taqi | 2015-03-09
Vous devez vous connecter pour publier un commentaire.
Pour une solution appropriée, soit normaliser votre conception de base de données ou, à défaut, envisager recherche en texte intégral.
Pour une solution rapide à ce problème, utiliser un expression régulière (
~
) ou trois simplesexpressions:
Ou:
Ou de l'utilisation
~*
ouILIKE
comparaison insensible à la casse.Depuis une autre réponse suggérée: jamais utilisation
SIMILAR TO
:OriginalL'auteur Erwin Brandstetter
Essayez d'utiliser
SIMILAR TO
comme ci-dessous:Aussi, vous devriez lire sur la normalisation de base de données. Votre conception pourrait et devrait certainement être améliorée.
OriginalL'auteur benscabbia
Vous pouvez utiliser ceci:
https://postgres.cz/wiki/PostgreSQL_SQL_Tricks#LIKE_to_list_of_patterns
OriginalL'auteur Mario Leonel
Utilisation OU dans la clause where, comme,
Espère que cela fonctionne.
Cela sonne comme de la mauvaise conception de base de données, en effet. Comme vous pouvez le lire jusqu'à normalisation de base de données et aussi de prendre un coup d'oeil à Est de stocker une liste délimitée par des virgules dans une base de données de la colonne vraiment si mauvais?
Dans ce cas, vous avez vraiment besoin de considérer la Recherche en texte intégral, comme suggéré par eggyal.
OriginalL'auteur BabyDuck