1
votes

Comment puis-je demander l'utilisation de l'opérateur BETWEEN pour les recherches de texte dans la base de données MySql?

J'ai une table SQL dans laquelle j'utilise l'opérateur BETWEEN .

L'opérateur BETWEEN sélectionne les valeurs dans la plage. Les valeurs peuvent être des nombres, du texte, des dates.

SELECT * FROM student WHERE stu_id BETWEEN 2 AND 4     //including 2 & 4

SELECT * FROM `student` WHERE name between 'A' and 'K'  //including A & not K

J'ai une requête comme celle-ci: -

 stu_id name            city     pin
    1   Raj            Ranchi   123456
    2   sonu           Delhi    652345
    3   ANU           KOLKATA   879845
    4   K.K's Company   Delhi   345546
    5   J.K's Company   Delhi   123456

Ici Ma question est pourquoi ne pas inclure K.
mais je veux K aussi dans les recherches.


6 commentaires

Le Entre sautera le dernier enregistrement de la table. Ainsi, le «K» ne sera pas inclus.


@SathishChelladurai pourquoi Between sautera le dernier enregistrement de la table?


L'opérateur BETWEEN est un opérateur logique qui vous permet de spécifier si une valeur dans une plage ou non. Vous pouvez vous référer à MySQL BETWEEN ici mysqltutorial.org/mysql-between


@SathishChelladurai si 'A' & 'K' dans la plage alors pourquoi 'K' n'est pas inclus en sortie?


Vérifiez ma réponse, espérons que cela fonctionnera pour vous.


De la même manière que Entre 1 et 2 ne renverra pas 2.1.


4 Réponses :


3
votes

N'utilisez pas entre - jusqu'à ce que vous le compreniez vraiment. Ce ne sont que des conseils généraux. BETWEEN est inclusif, donc votre deuxième requête est équivalente à:

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

En raison de l'égalité, 'K' est inclus dans le jeu de résultats. Cependant, les noms de plus d'un caractère et commençant par 'K' ne sont pas - "Ka" par exemple.

Au lieu de cela, soyez explicite:

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

Bien sûr, BETWEEN peut être utile. Cependant, il est utile pour les valeurs discrètes , telles que les entiers. C'est un peu dangereux avec des nombres avec des décimales, des chaînes et des valeurs de date / heure. C'est pourquoi je vous encourage à exprimer la logique comme des inégalités.


4 commentaires

Et ici, je me suis dit que les traiteraient comme des valeurs discrètes et ne permettraient même pas plus d'un personnage, quel comportement étrange


@Gordon Linoff monsieur donc quelle requête j'ai écrite pour que «K» également dans les recherches.


@MohitKumar J'ai mis à jour la requête dans ma réponse. Veuillez cocher la case qui inclura «K» dans vos recherches.


@MohitKumar. . . J'ai inclus cette question, le dernier exemple dans la réponse.



0
votes

En complément de la réponse de Gordon, une façon d'obtenir ce que vous attendez est de transformer votre nom en un ensemble discret de valeurs:

SELECT * FROM `student` WHERE name >= 'A' and name < 'L'

Vous devez comprendre que KK La société de est alphabétiquement APRÈS la lettre K seule donc elle n'est pas ENTRE, de la même manière que 4.1 n'est pas ENTRE 2 et 4 p>

En le réduisant à un seul caractère à partir du début de la chaîne, cela fonctionnera comme prévu, mais attention, vous devez toujours éviter d'exécuter des fonctions sur des valeurs dans les tables, car si vous aviez un million de noms , c'est un million de chaînes que mysql doit supprimer uniquement à la première lettre et il pourrait ne plus être en mesure d'utiliser un index sur le nom, ce qui nuit aux performances.

À la place, vous pouvez:

SELECT * FROM `student` WHERE LEFT(name, 1) between 'A' and 'K' 

qui est plus susceptible de permettre l'utilisation d'un index car vous ne manipulez pas les valeurs stockées avant de les comparer

Cela fonctionne car il demande tout jusqu'à, mais non compris, L .. Ce qui inclut tous vos noms commençant par K, même kzzzzzzzz . Numériquement, cela revient à dire nombre> = 2 et nombre qui vous donne tous les nombres commençant par 2, 3 ou 4 (comme le 4.1 d'avant) mais pas le 5

N'oubliez pas que BETWEEN est inclusif aux deux extrémités. Revenez toujours à un modèle de a> = b et a , a> = c et a lorsque vous souhaitez spécifier des plages qui capturent toutes les valeurs possibles p>


0 commentaires

0
votes

Comparez dans l'ordre lexicographique, 'K.K's Company'> 'K'


0 commentaires

0
votes

Nous devons convertir la chaîne en entier. Vous pouvez essayer ce script mysql avec CAST et SUBSTRING. J'ai mis à jour votre script ici. Il inclura également le dernier enregistrement.

SELECT * FROM student WHERE name CAST(SUBSTRING(username FROM 1) AS UNSIGNED)
BETWEEN 'A' AND 'K';

Le script fonctionnera. J'espère que cela vous aidera.

J'ai joint ici mon échantillon de test.

 entrez la description de l'image ici


0 commentaires