begin process at 2010 02 10 00:29:54
  Trouver un code source :
 
dans
 
Accueil > Forum > 

SQL

 > 

SQL Server, MSDE, SQL Express

 > 

Requêtes

 > 

select et cast ...


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

select et cast ...

lundi 29 juin 2009 à 13:27:35 | select et cast ...

cudenetf

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
lundi 29 juin 2009 à 14:47:52 | Re : select et cast ...

nivsql

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.
lundi 29 juin 2009 à 15:49:08 | Re : select et cast ...

cudenetf

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'... ???
lundi 29 juin 2009 à 16:45:42 | Re : select et cast ...

nivsql

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)
lundi 29 juin 2009 à 16:55:46 | Re : select et cast ...

nivsql

(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).
lundi 29 juin 2009 à 17:04:30 | Re : select et cast ...

nivsql

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.
lundi 29 juin 2009 à 17:38:04 | Re : select et cast ...

cudenetf

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 ???

lundi 29 juin 2009 à 17:54:50 | Re : select et cast ...

nivsql

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.
lundi 29 juin 2009 à 18:15:22 | Re : select et cast ...

cudenetf

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...

lundi 29 juin 2009 à 18:27:28 | Re : select et cast ...

nivsql

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.

1 2

Cette discussion est classée dans : int, type, select, ref, cast


Répondre à ce message

Sujets en rapport avec ce message

Trouver le type des champs de la Bdd [ par chris81 ] bonojour,ya t'il un moyen de connaitre les attributs des champs de la base par exemple j'ai Id_User : intya t'il une requete qui me permettrait de me problème concaténation [ par chamallow ] Bonjour,J'ai un petit problème avec une concaténation. C'est tout bête mais bon.SELECT CAST("1/1/" + CAST(annee AS CHAR(4)) AS DATETIME)from maTableSq comportement de l'attribut REF dans une BD objet-relationnelle (sql) [ par Mymy1984 ] salut tout le monde :Ma question est:Est ce que  c vrai que  l'attribut de type REF permet d'avoir plusieurs références vers des objets différents de Plantage Mysql sur requête [ par kohntark ] Salut,Voici mon problème :tables :a : ~478 305 enregistrementsb : ~465 813 enregistrementsc : ~460 070 enregistrementsJe cherche à trouver les ref pré procedure select [ par abdoulax ] Bonjour,Je suis en train de faire un projet oracle pour mes études. Ce projet mélange du php avec une base oracle. Lors d'un bilan en cours de projet requete recherche sur un champ binary [ par hwoarangbe04 ] Bonjour alors on m'a dit que cela était possible et donc j'ai cherché avec GOOGLE mon ami et pas trouvé d'élément répondant à ma question . Comment fa expliquer fonctionnement des procedure [ par tuteur59000 ] Bonjourpouvez vous m'expliquer les 3procédures avec leur requetes  suivantes svp?merci pour la réponse (procedures facturer,procedur provléme de recursivité [ par zwiki ] bonjour tout le monde j'ai un message d'erreur qui s'affiche avec cette requette "Syntaxe incorrecte vers le mot clé 'WITH'" malgré que j'ai bien suiv Requête avec UNION mais une seule ligne / groupe [ par tommy_red_card ] Je dois dans la même ligne avec un montant avec une restriction et le même sans restriction. J'ai une table avec les champs Type, Montant, semaine. Je Calcul de pourcentage. [ par AUZUR ] Bonjour à tous, voila, j'ai un problème avec une requète SQL, sur SQLServer. J'ai une table TabReg(NomRegion, CAreg, Population) avec laquelle, j'aim


Nos sponsors


Sondage...

CalendriCode

Février 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,328 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales