6
votes

SQL - où critères pour trouver des noms entre A-F

Question simple:

J'ai besoin d'une solution pour que je puisse trouver, disons des noms, entre A-F, y compris tous les noms commençant par f.

Si vous utilisez entre ou une valeur> = = = F, vous découvrez qu'il s'arrête à F. Donc, je pose cela pour des suggestions.

NOTE: L'utilisateur verra 2 textes de texte acceptant un utilisateur de plage peut taper. L'utilisateur affine à quelle distance pour aller en F fr en tant que tels: types d'utilisateurs dans 'FA' signifie que le résultat devrait revenir: Fauder, échouer, Famber, ... etc

J'ai actuellement 2 solutions, mais il y a une meilleure façon.

solution 1: Cela ajoutera 1 à la limite extérieure, mais peut inclure un résultat s'il y a un nom simple 'g', très peu probable cependant. Où nom> = 'a' et <= char (ASCII ('F') + 1)

solution 2: Cette solution ajoute la dernière lettre des temps de longueur de champ d'alphabet. OÙ name> = 'A' ET <= 'FZZZZZZZZZZZZZZZZZZZZZ'

Bien que les solutions ci-dessus soient fonctionnelles, ma recherche peut être affinée comme telle: A à FS (devrait me donner tout de A à et y compris FS ....). Avec cette solution n ° 1 est cassée car elle fonctionne avec une seule ASCII.

Les suggestions sont les bienvenues.


1 commentaires

SQL Server 2000 ou plus tard


5 Réponses :


11
votes

Vous pouvez faire:

WHERE name >= 'A' AND name < 'G'


12 commentaires

Seulement si nous pouvions durer des choses du code. Je cherche une formule. Ce qui précède rendra également un nom «g» qui est incorrect.


@ActiveX - Que voulez-vous dire avec "une formule"? Quel sont les paramètres attendus de votre requête ?, et non, il ne retournera pas un nom qui est g .


@ActiveX - Ceci utilise << / code> plutôt que <= ou entre . Il s'agit d'un modèle très normal et puissant, qui ne se soucie pas du champ de caractères nom ou nécessite des fonctions sur le champ nom (qui est important comme étant Ces fonctions détruisent la possibilité d'utiliser une plage d'index la recherche). Personnellement, c'est exactement ce que j'utiliserais.


Cette réponse est préférable car il est plus probable qu'il puisse utiliser des indices. Si vous utilisez la fonction substrative (), vous êtes susceptible d'obtenir une analyse de table.


@Lamak: formule de sorte qu'il fonctionne avec différents paramètres. Vous avez des valeurs codées dans la clause WHERE. Les paramètres attendus de la procédure stockée seront des chaînes, je viens d'utiliser des valeurs codées en papier pour simplifier mes questions oui, il renvoie un nom «G», c'est la manière dont l'opérateur fonctionne et y compris la limite extérieure G. Donc, si votre nom est donc 'G', il sera retourné.


@Dems: Si j'utilise <, cela exclura toute la limite extérieure, dans cet exemple 'F', Frank, Friedrich, etc. Je veux que tous les "F" soient inclus, à moins que l'utilisateur affine à quelle distance pour aller dans F en tant que telle: Types d'utilisateurs dans 'FA' signifie Fauder, échouer, Famber.


@ActiveX - La limite de la réponse est g , pas f . Mais sur la base de vos commentaires, j'ai également ajouté une réponse. ( s'il vous plaît Pourriez-vous ajouter le contenu de votre commentaire à votre question, c'est extrêmement pertinent.)


@ActiveX - Vous ne semblez pas comprendre comment fonctionne le fonctionnement de l'opérateur << / code>, il ne doit pas renvoyer un nom 'g'. Avez-vous réellement essayer le code ci-dessus?, J'ai, et cela fonctionne. Vous vouliez filtrer la lettre f c'est pourquoi j'utilise g sur mon code


@Lamak: oooops mon mauvais! Il est tôt le matin, je ne suis pas complètement réveillé. Vous avez raison!


@Dems: oooops mon mauvais! Il est tôt le matin, je ne suis pas complètement réveillé. Vous avez raison!


Le concept @lamak tente d'introduire est inclusif / exclusif. Souvent, lorsque nous voulons une gamme, il est commode d'avoir une définition inclusive du début et une définition exclusive de la fin. Cela nous permet en outre d'utiliser la fin de la requête précédente comme début de la requête suivante. Si ces paramètres sont dans une table quelque part, le fait que les extrémités des requêtes = le démarrage de la suivante, rend également les tests d'écriture pour vérifier également l'intégrité des paramètres.


@jerry: Je sais que mes yeux étaient à la fermeture de "<" au lieu de "<=".



4
votes

Que diriez-vous de cela? XXX


4 commentaires

Pas mal. Cela fonctionnera mais nécessite plus de programmation. Dans mon cas, l'utilisateur peut affiner la recherche à: A - FS ou un FXXX. Je pourrais utiliser votre approche et écrire du code pour calculer la longueur de champ de la 2e limite et une alimentation au substrateur, mais elle devient en désordre.


Fonctionne, mais mettre une fonction autour du champ nom empêche l'Index recherche et entraîne une analyse complète.


@ActiveX - Que voulez-vous dire que l'utilisation peut spécification a - fxxx ? Cela change de manière significative le comportement que vous avez décrit dans votre question. S'il vous plaît pourriez-vous mettre à jour la question pour inclure toutes les fonctionnalités dont vous avez besoin?


Je m'excuse: 2 zones de texte qui acceptent un utilisateur de plage peuvent taper. Si l'utilisateur affine à quelle distance d'aller en F en tant que tels: types d'utilisateurs dans 'FA' signifie Fauder, échouer, Famber.



2
votes

Cela fonctionnera-t-il pour vous:

select * 
from MyTable
where left(name, 1) between 'a' and 'f'


1 commentaires

Fonctionne, mais mettre une fonction autour du champ nom empêche l'Index recherche et entraîne une analyse complète.



1
votes

Dans un commentaire Vous élargissez l'exigence d'inclure A - fxxx . xxx

Notez que cela n'inclut pas les fonctions sur le nom champ; Ces fonctions empêchent la gamme de recherches sur les index. Cependant, l'inclusion du ou dégrade également l'index de la recherche. Bien que ce soit un code supplémentaire, cela peut réellement être plus performant.

Intérieur, votre solution 2 , bien que vous ne l'aimez pas, c'est probablement le meilleur.

Tourner FXXX FXXX FXXX à FXXXZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ SIMPLE SIMPLE AVEC STUB () , à condition que vous connaissiez la longueur maximale de la chaîne, que vous devez faire en tant que la base de données.

Il n'a pas de fonctions sur le champ nom , et il n'utilise pas de ou dans le clause. Ce qui signifie que vous obtenez une gamme pure recherche sur n'importe quel index.

performance sage, je ne pense pas que vous puissiez améliorer cela.


1 commentaires

C'est exactement ce que je cherchais! Merci beaucoup et merci à tous pour des réponses.



2
votes

Combien plus simple pouvez-vous le faire? XXX


1 commentaires

Travaillera avec une seule valeur de caractère uniquement. Pas avec des gammes telles que: A-FA, A-FB. Je n'étais pas explicite sur ma question, je m'excuse. J'ai édité ma question et ajouté plus de détails.