SQL - la Combinaison de plusieurs requêtes de type
Hey ma première question sur LE! Anywho...
Encore relativement un newb en SQL, donc je pense que j'ai peut-être raté quelque chose ici. Ma question est j'ai actuellement un tableau plein de numéros de téléphone. Je veux avoir une requête où je rechercher des numéros de téléphone qui sont semblables à une liste que j'ai. Ainsi, par exemple, je veux trouver les numéros de téléphone qui commencent par '555123', '555321", et "555987'. Je sais que normalement, si vous avez une liste de nombres, vous pourriez faire une requête telle que
SELECT *
FROM phonenumbers
WHERE number in ('5551234567', '5559876543', .... );
Est-il un moyen de le faire avec? Comme
SELECT *
FROM phonenumbers
WHERE number in like ('555123%', '555321%', '555987%'); //I know this doesn't actually work
Au lieu d'avoir à le faire individuellement
SELECT *
FROM phonenumbers
WHERE number like '555123%'
or number like '555321%'
or number like '555987%'; //Which does work but takes a long time
Ou est-il plus facile de faire ce que je suis absent? J'utilise postgres, je ne sais pas si il y a toutes les commandes qui pourraient l'aider avec ça. Merci!
Quelle est la version de Postgres? Sonne comme un travail pour regexes: postgresql.org/docs/8.3/static/functions-matching.html
Which does work but takes a long time
- à moins de changer la nature de la requête, une autre représentation syntaxique de la même chose va prendre du temps. Est la colonne indexée?Combien de temps reçoit votre requête?
En fait, la colonne est indexée. Je n'avais pas remarqué ça avant. Oh, et je suis en utilisant postgresql 8.0. J'ai une grande quantité de chiffres, je suis à la recherche.
OriginalL'auteur The Jug | 2010-02-11
Vous devez vous connecter pour publier un commentaire.
Vous pouvez utiliser
SIMILAR TO
et séparer les tags avec | pipe'555123%|555321%|555987%'
par exemple:
OriginalL'auteur Pentium10
La fin de la partie, mais pour la postérité... Vous pouvez également utiliser un TOUT(array expression)
FWIW il y a aussi un "COMME TOUS les(...)" l'option stackoverflow.com/a/5742019/32453
OriginalL'auteur RickyA
En supposant que tous vos numéros de ne pas contenir que des lettres, et vos numéros sont toujours des "préfixes" (ex:
LIKE '123%'
):Cela utiliser un index sur
phonenumbers
, le cas échéant, pourrait donc être plus rapide.J'ai été faire ma vie en dehors de ça pour
12
ans. Je n'ai jamais vu d'un bon livre sur la base de données internes (encore), la presque totalité de ce que j'ai compris moi-même.Avez-vous un blog ou les intentions d'écrire un livre à ce sujet? Je serais parmi les acheteurs.
href="http://explainextended.com" >explainextended.com Le livre est en cours, mais c'est un secret encore, s'il vous plaît ne pas le dire à personne.
OriginalL'auteur Quassnoi
Je ne le pense pas, mais vous pouvez vous joindre
phonenumbers
sur une tablecriteria
contenant les valeurs que vous voulez match de suite, c'est à dire...probablement pas la peine pour un petit nombre de conditions, si
ou de créer de la table temporaire. Ne sera probablement pas toute l'accélération à partir d'autres options, mais une option whoa.
OriginalL'auteur toasteroven
Peut-être si votre préfixes sont toutes de la même longueur, alors vous pouvez le faire
where RIGHT(number) in ('123456', '234456', 'etc', 'etc')
OriginalL'auteur flybywire
Vous pouvez également vous appuyer sur les expressions régulières POSIX, voir la section 9.7.3 de la la documentation officielle.
Par exemple:
Il est important de noter que votre
name
champ est de type chaîne.OriginalL'auteur Victor Farazdagi