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 p> J'ai des valeurs telles que 11, 12, 21 et tout ce qui n'est pas affichant ces choses p> p>
6 Réponses :
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. P>
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
Si vous ne pouvez pas modifier votre type de colonne, vous devez utiliser Cast ou Convertir avant de faire la comparaison. Votre code serait: un peu d'avertissement strong>: 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. P> p>
J'ai dû utiliser comme décimal code> (peut-être que cela aide quelqu'un)
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;
... é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.
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
... échouera pour des données non numériques
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 ? 6 ans, 6 mois, 65 jours? P> 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»). p> 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). P> 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. P> p>
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
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.
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?