Comparaisons numériques sur datatables de colonne de string

j'ai besoin d'une aide n requête

"totalexp" est un champ nvarchar … dans un tableau et j'ai besoin de sélectionner comme ci-dessous

select EmpId,FirstName,totalexp from sample where totalexp > '6' empid firstname totalexp 1 Me 8.2 5 as 6 10 567 64 mon 11 leader 6+ yrs 12 admintest 6.3 16 G 6 

j'ai des valeurs comme 11, 12, 21 et tout ce n'est pas afficher ces choses

Si vous ne pouvez pas changer votre type de colonne, vous devez utiliser CAST ou CONVERT avant de faire la comparaison. Votre code serait:

 SELECT EmpId, FirstName, TotalExp FROM sample WHERE CAST(TotalExp AS INT) > 6 

Un petit avertissement : avec votre structure de database actuelle, n'importe qui peut insert TotalExp comme 'One' ou 'Two' ou n'importe quelle autre string arbitraire, et votre requête échouera. Pas vraiment quelque chose que tu veux arriver, sérieusement.

Le désordre commence avec TotalExp étant nvarchar, car il contient des données qui peuvent être "6 mois", "6 ans", "6 + ans", etc. Quelle est l'intention derrière

 where totalexp > '6' 

? 6 ans, 6 mois, 65 jours?

Vous devez convertir datatables en un format numérique, par exemple un nombre de mois que vous pouvez comparer à certaines exigences (en tant qu '«expérience mois»).

Cependant, en une année vos données deviendront obsolètes car elles ne changeront pas, comme vous le feriez sauf que chaque TotalExp qui indique maintenant "6 ans" devrait alors être "7 ans" (si cette compétence a été pratiquée entre-time).

Donc, pour les compétences actives, il serait préférable d'avoir un champ ExperienceSince DATETIME, ce qui a pour effet que son «expérience totale» est toujours à jour.

Ma principale recommandation à votre égard serait d'effectuer un exercice de nettoyage des données afin de normaliser datatables de la colonne. À l'heure actuelle, il existe plusieurs forms / normes de données dans une même colonne.


Cependant, si vous souhaitez ignorer complètement datatables de caractères, alors, pour tenir count des valeurs de colonne qui ne se convertiront pas naturellement en integer, vous pouvez utiliser la fonction isnumeric () pour tester datatables de colonne comme étant numériques.

Voir l'exemple suivant pour plus de détails:

 create table #testTable ( NumericAsSsortingng nvarchar(100) ); insert into #testTable (NumericAsSsortingng) values('1'); insert into #testTable (NumericAsSsortingng) values('4'); insert into #testTable (NumericAsSsortingng) values('28'); insert into #testTable (NumericAsSsortingng) values('32'); insert into #testTable (NumericAsSsortingng) values('11232'); insert into #testTable (NumericAsSsortingng) values('fdsfdfas'); insert into #testTable (NumericAsSsortingng) values('wtwtrwtw'); select * from #testTable; select NumericAsSsortingng from #testTable where ( case when isnumeric(NumericAsSsortingng) = 1 then convert(int, NumericAsSsortingng) else 0 end) > 6 drop table #testTable; 

Peut-être que 'totalexp' doit être un champ numérique (int etc) plutôt que nvarchar pour la comparaison dans la clause where. Utiliser nvarchar pour stocker des numéros n'est pas une bonne idée.

Essayez d'utiliser Cast ou Convertir sur vous où clause pour changer le type de totalexp en entier.

 SELECT EmpId,FirstName,totalexp FROM sample WHERE CONVERT(int ,totalexp) > 6 

Je sais que la question est très ancienne. Juste postr la réponse parce que cela pourrait être utile pour quelqu'un.

Le code ci-dessous peut être utilisé dans des scénarios où il existe des valeurs non numériques pour les autres lignes.

 SELECT EmpId,FirstName,totalexp FROM sample WHERE (CASE WHEN (ISNUMERIC(totalexp) = 1) THEN CAST(LTRIM(RTRIM(totalexp)) AS float) ELSE 0 END) > 6 

Le code est testé en fonctionnement