0
votes

SQL Server où entre les nombres qui ont un texte avant / suffixe

Je dois retourner des correspondances avec une gamme de numéros de série, mais le préfixe et le suffixe doivent être supprimés

IE. J'ai besoin de rechercher entre les numéros de série ci-dessous, mais les numéros séquentiels ne sont que la partie centrale.

G4A41103801702 - G4A41113171702

G4A [4110380] 1702 - G4A [4111317] 1702

Je dois exclure les 3 premiers et les 4 derniers chiffres, puis rechercher entre 4110380-4111317

merci


4 commentaires

Lorsque vous dites "recherche entre", vous voulez dire tous les enregistrements> = 4110380 et <= 4111317? Ces cordes sont-elles toujours la même longueur et les chiffres requis toujours dans la même position dans les cordes? Si tel est le cas, vous devez utiliser une fonction de sous-chaîne pour trouver les chiffres de la position attendue et de la longueur attendue, jetez-la à un numéro et utilisez-la dans votre clause WHERE. Probablement ne sera probablement pas très efficérable, bien que du manque d'indexation sur ces valeurs. Si vous avez besoin de rechercher sur ces valeurs, cela pourrait être une bonne idée de les analyser dans une colonne séparée à l'insert-Time


Si possible, vous devriez voir la réparation de votre structure de données. Cela viole 1NF en faisant de multiples valeurs en un seul tuple. Il provoque toutes sortes de défis tels que les problèmes de performance et les requêtes gravement laides pour ce qui devrait être simple. Cela devrait être trois colonnes, puis une colonne calculée pour les mettre tous ensemble.


^ Ce que dit Sean, plusieurs fois plus.


Une fois que nous avons les règles de votre part sur la façon d'analyser le code dans ses 3 parties constitutives, alors l'idée susmentionnée des colonnes calculées est une bonne idée, mais d'éviter les changements système que vous pourriez faire 3 colonnes calculées contenant les parties constitutives, donc Faire des requêtes sur les valeurs faciles et potentiellement indexables.


3 Réponses :


3
votes

Baton, essayez une variante de la requête ci-dessous:

Remplacer ID avec la colonne que vous souhaitez sélectionner.

remplacer Tableau avec Votre nom de table réelle.

suppose SerialNumber est le nom de la colonne avec la série à interroger.

suppose que la longueur du numéro de série est constante. xxx

comme @Adyson mentionné, cela n'utilisera pas un index et vous devez extraire ce numéro dans une colonne indexée distincte pour une requête plus performante. J'espère que cela vous aidera!


3 commentaires

Je pense que vous voudrez peut-être lancer le résultat de la sous-chaîne à int


Merci, je le pense, mais si je voulais exclure les 3 premiers caractères, les sous-chaînes ne devraient pas commencer par 4 non 3?)


@ R.Baton Oui, vous êtes correct, cela devrait. Espérons que Sean corrigera la réponse à un moment donné



0
votes

Si la longueur n'est pas constante, vous pouvez combiner inverse code> fonction deux fois pour exclure le document 3 code> et DERNIER 4 code> chiffres:

substring(reverse(substring(reverse('G4A41103801702'),5)),4) ==> '4110380'


1 commentaires

Pas besoin de lancer comme INT; cela arriverait automatiquement



0
votes

Je manipulerais cela comme: xxx

retours: xxx

Vous pouvez ensuite utiliser C1 et C2 ailleurs.


0 commentaires