7
votes

Comparaisons numériques sur les données de colonne de chaîne

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

"TotalExp" est un champ Nvarchars ... dans une table et j'ai besoin de sélectionner comme ci-dessous xxx

J'ai des valeurs telles que 11, 12, 21 et tout ce qui n'est pas affichant ces choses


3 commentaires

Convertissez la colonne en premier. C'est plus approprié de cette façon.


Serait-il blessé d'inclure une description dans la question !!!


Je suppose que vous avez "MON", "YRS", "+", etc. dans la colonne TOTALEXP? Lors du filtrage, voulez-vous "6,3" et "64 lun" dans la sortie, ou uniquement des données véridiques entier / numérique?


6 Réponses :


2
votes

Peut-être 'TotalExp' doit peut-être être un champ de numéro (INT, etc.) plutôt que de NvarchaRar pour la comparaison dans la clause où travailler. Utiliser NvarcharN pour stocker des chiffres n'est pas une bonne idée.


1 commentaires

Oui, vous êtes correct, mais c'est une table ancienne utilisée dans les affaires, mais je dois maintenant filtrer en fonction de cette condition. Y a-t-il un moyen



12
votes

Si vous ne pouvez pas modifier votre type de colonne, vous devez utiliser Cast ou Convertir avant de faire la comparaison. Votre code serait: xxx

un peu d'avertissement : avec votre structure de dB actuelle, tout le monde peut insérer totalexp comme "un" ou "deux" ou tout autre arbitraire String, et votre requête échouera. Pas vraiment quelque chose que vous voulez arriver, sérieusement.


1 commentaires

J'ai dû utiliser comme décimal (peut-être que cela aide quelqu'un)



3
votes

Ma première recommandation vous permettrait d'effectuer un exercice de nettoyage de données afin de normaliser les données de la colonne. À l'heure actuelle, il existe de multiples formes / normes de données dans une seule colonne.


Si vous souhaitez ignorer complètement les données de caractères, alors afin de rendre compte des valeurs de colonne qui ne convertira pas naturellement en un entier que vous pourriez faire Utilisation de la fonction isnumérique () pour tester les données de colonne comme étant numérique. p>

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

create table #testTable
(
    NumericAsString nvarchar(100)
);

insert into #testTable (NumericAsString) values('1');
insert into #testTable (NumericAsString) values('4');
insert into #testTable (NumericAsString) values('28');
insert into #testTable (NumericAsString) values('32');
insert into #testTable (NumericAsString) values('11232');
insert into #testTable (NumericAsString) values('fdsfdfas');
insert into #testTable (NumericAsString) values('wtwtrwtw');

select * 
from #testTable; 

select NumericAsString
from #testTable
where 
    (
    case 
        when isnumeric(NumericAsString) = 1 then convert(int, NumericAsString)
        else 0
    end)
    > 6 

drop table #testTable;


4 commentaires

... échouera pour des données non numériques


@GBN: Absolument mais moi, car on aurait pensé que ça va sans dire. Pour une clarté améliorée Cependant, j'ai amplifié le message original à tester maintenant les données numériques


Je ne supposerais jamais que les gens choisissent cela ... Je pense que l'exigence est vague encore. Qu'est-ce que OP veut réellement filtrer?


C'est en effet un peu peu clair. Je soupçonne que les options de raccourci sont envisagées plutôt que d'investir le temps de nettoyer / normaliser les données et de résoudre ainsi directement le problème sous-jacent.



2
votes

Essayez d'utiliser Cast ou convertir sur vous où la clause de changement le type de totalExp vers un entier.

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


1 commentaires

... échouera pour des données non numériques



5
votes

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

? 6 ans, 6 mois, 65 jours?

Vous devez convertir les données en format numérique, par exemple un certain nombre de mois que vous pouvez comparer contre certaines exigences (comme «mois d'expérience»).

Cependant, dans un an, vos données deviendront obsolètes car elles ne changent pas, si vous le feriez, sauf que chaque TotalExp indique désormais "6 ans" devrait alors être "7 ans" (si cette compétence a été pratiquée dans l'entre-temps).

Ainsi, pour des compétences actives, il serait préférable d'avoir une expérience de DateTime, qui a l'impact intéressant que sa "expérience totale" résultante est toujours à jour.


0 commentaires

6
votes

Je sais que la question est très ancienne. Il suffit de poster la réponse car il 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 d'autres lignes. P>

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


1 commentaires

Je me tromperais peut-être mais je me sens comme "autre 0" (la dernière ligne) pourrait causer des résultats erronés lors de la comparaison à zéro. Peut-être devriez-vous utiliser "autre null" à la place.