web-dev-qa-db-fra.com

Opérateur similaire pour l'entier

J'ai une colonne de type bigint (ProductSerial) dans mon tableau. Je dois filtrer la table en fonction de la série du produit en utilisant le même opérateur. Mais j'ai trouvé que, comme opérateur ne peut pas être utilisé pour le type entier.

Existe-t-il une autre méthode pour cela (je ne souhaite pas utiliser l'opérateur =).

9
Raging Bull

Si vous devez utiliser LIKE, vous pouvez convertir votre nombre en char/varchar et effectuer la LIKE sur le résultat. C'est assez inefficace, mais comme LIKE a un potentiel élevé de destruction d'index de toute façon, cela pourrait fonctionner dans votre scénario:

... AND CAST(phone AS VARCHAR(9)) LIKE '%0203'

Si vous souhaitez utiliser LIKE pour faire correspondre le début ou la fin du nombre, vous pouvez utiliser des opérateurs de division entière et de module pour extraire les chiffres. Par exemple, si vous souhaitez que tous les numéros à neuf chiffres commençant par 407, recherchez

phone / 1000000 = 407
12
dasblinkenlight

Bien que je sois un peu en retard à la fête, j'aimerais ajouter la méthode que j'utilise pour faire correspondre les N premiers nombres donnés (dans l'exemple, 123) dans n'importe quelle colonne de type numérique:

SELECT * FROM MyTable WHERE MyColumn / POWER(10, LEN(MyColumn) - LEN(123)) = 123

La technique est similaire à celle de @ dasblinkenlight, mais elle fonctionne quel que soit le nombre de chiffres des valeurs de la colonne cible. Cette solution de contournement est viable si votre colonne contient des nombres de longueur différente et que vous ne souhaitez pas utiliser la méthode CAST + LIKE (ou une colonne calculée).

Pour plus de détails à ce sujet (et d’autres solutions de contournement de type LIKE), consultez cet article de blog que j’ai écrit sur ce sujet.

2
Darkseal

Vous pouvez modifier vos numéros de téléphone sur le terrain et les stocker en tant que chaîne, puis utiliser la commande J'aime. Vous pouvez modifier votre table pour pouvoir utiliser l'instruction LIKE. Si vous souhaitez toujours utiliser BIGint pour vos numéros de téléphone, vous ne pouvez pas obtenir le numéro de téléphone exact sans utiliser = la méthode que vous pouvez utiliser est la méthode Between qui recherche les numéros qui se trouvent dans la plage.

Pour la question modifiée: je pense que vous devriez utiliser = sign pour leur identifiant, ou convertir Int en String, puis utiliser Like.

1
Albert Laure

La question initiale concernait un numéro de téléphone. OP l'a depuis modifié pour faire référence aux numéros de série. Cette réponse fait référence à la question initiale uniquement.

Ma suggestion est d'éviter de stocker vos numéros de téléphone sous forme d'entiers en premier lieu, et ainsi le problème ne se produit pas. Mon numéro de téléphone est sous la forme, à l'international, de:

    +44 7844 51515

Le stocker sous forme d’entier n’a aucun sens ici, car vous n’aurez jamais à effectuer d’opération mathématique sur celui-ci et vous perdriez l’avantage principal. Au Royaume-Uni, c'est:

    07844 51515

et donc le stocker en tant qu'entier perdrait son zéro initial. À moins que vous n'ayez very besoin de le stocker en tant qu'entier, vous feriez beaucoup mieux de le stocker sous forme de chaîne.

[Note: Pas vraiment mon numéro de téléphone]

0
Adrian Wragg

Si vous avez le contrôle de la base de données, vous pouvez ajouter une colonne calculée pour copier la valeur entière dans une chaîne:

ALTER TABLE MyTable
ADD CalcCol AS (CAST(ProductSerial AS VARCHAR)) PERSISTED

Et requête comme:

SELECT *
FROM MyTable
WHERE ProductSerial LIKE '%2548%'

Cela déplacera le calcul vers l'insertion/la mise à jour et uniquement sur les lignes insérées/mises à jour plutôt que la conversion de chaque ligne pour chaque requête. Cela peut poser un problème s'il y a beaucoup de mises à jour dans les colonnes car cela ajoutera une très petit frais généraux à ceux-ci.

Il y a peut-être un moyen de le faire mathématiquement en utilisant un module, mais cela demanderait beaucoup de travail et de tests.

0
bendataclear