Select et cast ...

cudenetf Messages postés 448 Date d'inscription mardi 20 septembre 2005 Statut Membre Dernière intervention 26 juillet 2012 - 29 juin 2009 à 13:27
cudenetf Messages postés 448 Date d'inscription mardi 20 septembre 2005 Statut Membre Dernière intervention 26 juillet 2012 - 8 févr. 2010 à 13:40
Bonjour, j'ai une question sur des requetes select avec des casts.
Je cherche a trouver le plus grand entier N dans une table tel que N>x1 et N<x2 ( avec x1 et x2 definis par moi)
le probleme c'est qaue le champ recherché est en fait de type varchar , donc il peut etre egalement une chaine de caractere...
En fait j'ai un autre critere de recherche qui est disons un type : le select donnerait
select max(ref) from matable where type='int' and cast(ref as int)>x1 and cast(ref as int)<x2
je suis sur que toutes les lignes de la table avec le champ type='int' representent un nombre
par contre si j'ecris cette formule , j'obtiens un message d'erreur  sur le cast ( la machine essaie d'effectuer un cast d'une ligne qui n'est pas de type'int' en fait, elle semble chercher ce qui correspond a mes criteres de selection mais pas selon un ordre special)

En fait ce que je voudrais faire c'est d'abord obtenir toutes le slignes du type='int' puis a l'interieur de cette selection trouver le max qui correspond a mes criteres de recherche
J'ai essayé un truc du genre select max(ref) from (select ref from matable where type='int') int where cast(ref as int)>x1 and cast(ref as int)<x2

mais j'obtiens exactement le meme message d'erreur, il me dit que la ligne avec ref='aaaeee' ne peut etre convertie en int alors que la ligne qui contient cet ref n'est pas du type='int'...

Y a t il une solution ? Comment faire ... ?

merci

13 réponses

nivsql Messages postés 159 Date d'inscription lundi 22 juin 2009 Statut Membre Dernière intervention 14 décembre 2010 1
29 juin 2009 à 14:47
tu dois passer par une sous requete ou une CTE pour simuler une vue.

quelque chose du type :

(Avec sous requete : )
Select max(ref) from
(select ref from matable where type='int')
where cast(ref as int) >x1 and cast (ref as int) <x2

(avec CTE)
WITH matable_int (ref) as (
select ref from matable where type='int'
)
Select max(ref) from matable_int
where cast(ref as int) >x1 and cast (ref as int) <x2

Ces 2 ecritures sont correctes.
0
cudenetf Messages postés 448 Date d'inscription mardi 20 septembre 2005 Statut Membre Dernière intervention 26 juillet 2012 2
29 juin 2009 à 15:49
merci pour cette reponse rapide
la premiere solution est celle que j'avais essayé il me semble
j'ai donc testé la deuxieme et j'obtiens le meme resultat

en gros il me sort une ligne de type='char' comme message d'erreur
Conversion failed when converting the varchar value 'REST37.1' to data type int.
hors je regarde dans mes lignes de type='int' aucune n'a ce champ ref , seules des lignes de type='char' l'ont ....
je ne comprend pas ....
pourquoi il me prend une ligne de type='char'... ???
0
nivsql Messages postés 159 Date d'inscription lundi 22 juin 2009 Statut Membre Dernière intervention 14 décembre 2010 1
29 juin 2009 à 16:45
La j'avous que je suis tres étonné.

Parmis les solutions envisageables il y a :
- Une entrée d'index vérolée, si ta requete prend un index essaye de reconstruire cet  index de ta table.
- Une donnée incohérante qui traine dans ta table.

Essaye de passer cette requete :

select type, ref, count(0) from matable
group by type, ref

Cela devrais te permettre de localiser une données inconhérante (j'espere que ta table est pas trop grosse)

Sinon regarde le plan d'execution de ta requete et vois quel index est utilisé (s'il y en a un), une fois cela fait : ALTER INDEX <nom de l'index> REBUILD;
(ajoute l'option ONLINE a la fin de ta commande si d'autres personnes utilisent la table en meme temps que toi histoire de pas les faire planter)
0
nivsql Messages postés 159 Date d'inscription lundi 22 juin 2009 Statut Membre Dernière intervention 14 décembre 2010 1
29 juin 2009 à 16:55
(Avec sous requete : )
Select max(ref) from
(select ref from matable where type='int' and ISNUMERIC(ref) =1)
where cast(ref as int) >x1 and cast (ref as int) <x2

(avec CTE)
WITH matable_int (ref) as (
select ref from matable where type='int' and ISNUMERIC(ref) =1
)
Select max(ref) from matable_int
where cast(ref as int) >x1 and cast (ref as int) <x2

Pour te defaire totalement de ton probleme d'un point de vu programmeur tu as les solutions ci dessus. Mais cela n'explique pas pourquoi tu a une reference alpha avec un type int (cf mon précédent message pour diagnostiquer le probleme).
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
nivsql Messages postés 159 Date d'inscription lundi 22 juin 2009 Statut Membre Dernière intervention 14 décembre 2010 1
29 juin 2009 à 17:04
Une autre requete de diagnostique serait la suivante :

SELECT DISTINCT [type], [refer] = case ISNUMERIC(ref) When 1 then 'Num' else 'Alpha' end
from matable
where ISNUMERIC(ref) <> 1

Avec tout ca j'espere que tu trouvera ton incohérence.
0
cudenetf Messages postés 448 Date d'inscription mardi 20 septembre 2005 Statut Membre Dernière intervention 26 juillet 2012 2
29 juin 2009 à 17:38
merci pour ces reponses multiples
ma table est trop grosse je vois pas toutes les lignes ...
je tiens a preciser que c du sqlexpress si jamais j'avais oublié
j'ai essayé alter index type_index  on matable rebuild ...
j'ai relancé avec et sans le isnumeric...

TOUJOURS LE MEME MESSAGE !!! grrrr comment cela se fait il ?

une autre idée ???
0
nivsql Messages postés 159 Date d'inscription lundi 22 juin 2009 Statut Membre Dernière intervention 14 décembre 2010 1
29 juin 2009 à 17:54
ISNUMERIC est une fonction standard de SQL Server qui renvois 1 si la valeur est un numéric valable et 0 sinon.

Si en ajoutant la clause ISNUMERIC(ref) = 1 tu bug encore alors tu es reelement face a quelque chose qui ne peut pas se diagnostiquer par forum.
0
cudenetf Messages postés 448 Date d'inscription mardi 20 septembre 2005 Statut Membre Dernière intervention 26 juillet 2012 2
29 juin 2009 à 18:15
ca veut dire quoi ? que ca ne peut pas marcher ?

le truc c'est que sql donne toujours exactement le meme message (donc il trouve la meme ligne en 1er) sur des milliers...
0
nivsql Messages postés 159 Date d'inscription lundi 22 juin 2009 Statut Membre Dernière intervention 14 décembre 2010 1
29 juin 2009 à 18:27
De fait, si la requete
select cast(ref as int) , type from matable where type = 'int' and ISNUMERIC(ref)=1 te renvois une erreur du type Conversion failed when converting the varchar value 'REST37.1' to data type int. Alors tu es face à quelque chose que je ne comprend pas (et crois moi j'ai un peu d'experience) car cette requete DOIT fonctionner quoi qu'il arrive, meme si dans ton champ ref il n'y avait aucune valeur numerique pour aucune ligne de ta table (simplement la requete ne retournerais aucune donnée).
Cette requete ne peux pas planter sauf BUG dans le moteur SQL.

La seule chose que je peux t'inviter a faire c'est passer le service pack 3 de SQL Express sur ton serveur et de voir si ca corrige le bug.
0
cudenetf Messages postés 448 Date d'inscription mardi 20 septembre 2005 Statut Membre Dernière intervention 26 juillet 2012 2
29 juin 2009 à 19:47
je vais essayer le service pack 3
en totu cas merci meme si ca ne marche pas la tout de suite j'aurais appris qques trucs
je teste et je vous tiens au courant
0
cudenetf Messages postés 448 Date d'inscription mardi 20 septembre 2005 Statut Membre Dernière intervention 26 juillet 2012 2
30 juin 2009 à 07:49
j'ai essayé le service pack 3,
le message d'erreur change : j'ai "error converting varchar to numeric"
toujours bizarre : j'ai redemarré l'ordi, alter index... pareil...
j'ai verifié par la requete : select ref from matable where type='int' and isnumeric(ref)=0
aucune ligne retournée...

comment fait on pour regarder le plan d'execution de la requete svp?
0
nivsql Messages postés 159 Date d'inscription lundi 22 juin 2009 Statut Membre Dernière intervention 14 décembre 2010 1
30 juin 2009 à 11:15
Sous Management studio express c'est CTRL+L pour le plan d'execution estimé.
0
cudenetf Messages postés 448 Date d'inscription mardi 20 septembre 2005 Statut Membre Dernière intervention 26 juillet 2012 2
8 févr. 2010 à 13:40
Bonjour, je sais que j'ai dej aposer la question mai sjusqu'au aujourd'hui j'ai toursles probleme
ca a marché un coup et puis ensuite non
sql arrive a me retourner impossible de transformer le type varchar en numeric
je suis passé ss sqlexpress2008 et je rencontre donc le meme problem que j'avais a l'epoque avec 2005
des qu eje met un > ou < ca marche plus !
voici des lignes que j'ai testé :

select max(q1.ec_ref) from
(select ec_ref
from table1
where jo='AC' and isnumeric(ec_ref)=1) as q1
go

ca ca me renvoie bien un nombre

mais si je fais :

select max(q1.ec_ref) from
(select ec_ref
from table1
where jo='AC' and isnumeric(ec_ref)=1) as q1
where q1ec_ref>1
go

j'obtiens un message d'erreur...

c'est a devenir fou...
0
Rejoignez-nous