Précédent   Forum des professionnels en informatique > Bases de données > Oracle > SQL
SQL Forum d'entraide sur le SQL pour Oracle
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 22/12/2007, 17h51   #1
Candidat au titre de Membre du Club
 
Inscription : novembre 2007
Messages : 37
Détails du profil
Informations forums :
Inscription : novembre 2007
Messages : 37
Points : 14
Points : 14
Par défaut utilisation des fonctions de caractère

bonjour,
comment faire une requête select sur une table afin qu'elle m'affiche un résultat filtré sur le type des données?

exemple:
soit une table contenant 1 seul champ "monchamp" et dont les enregistrements sont de type varchar2 mais dont certaines valeur sont '1', '3'... donc numérique et d'autres "1-A","3B"..etc .

Je dois ordonne numériquement les lignes de la table en utilisant les "fonctions de caractères";

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 
SQL> SELECT * FROM matable;
 
monchamp
-
1
7
10
1-A
2
3-B
3
43
etc...
Dans un autre post, on m'a suggéré d'utiliser Translate:

Code :
1
2
3
4
5
6
7
8
9
10
11
12
 
SQL> SELECT * FROM matable WHERE translate (monchamp, 'monchamp1234567890', 'monchamp') IS NULL ORDER BY to_number(monchamp) ASC;
 
monchamp
-
1
2
3
7
10
43
etc..
donc ok pour afficher et trier les valeurs numériques avec translate.

Cependant,je ne parviens toujours pas à trouver une solution dès que ce ne sont plus des valeurs numériques !!

*comment faire pour trier, à partir de cette même table, les valeurs qui ne sont pas numérique?

*comment trier la table complète (valeur numérique et non numérique mais toutes de type varchar2) ?
bb5477 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/12/2007, 18h22   #2
Membre à l'essai
 
Inscription : août 2007
Messages : 20
Détails du profil
Informations forums :
Inscription : août 2007
Messages : 20
Points : 20
Points : 20
Salut,

Si toutes tes valeurs alpha ont un format commun avec un '-'
comme dans 1-A, 1-B etc....

Tu peux faire un order by avec
to_number( substr( mon_champ, 1, instr(mon_champ,'-') -1 ) )

ce qui te permet de ne prendre que la partie de la chaîne qui est avant le caractère '-' et de transformer cette partie en numérique pour faire ton order by.

En revanche si tu n'as pas de format commun des alphas ça me semble plus difficile.
Phil_67 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/12/2007, 14h54   #3
McM
Expert Confirmé Sénior
 
Inscription : juillet 2003
Messages : 3 450
Détails du profil
Informations forums :
Inscription : juillet 2003
Messages : 3 450
Points : 4 209
Points : 4 209
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
WITH t AS (SELECT '1' AS champ FROM dual 
UNION ALL SELECT '7' FROM dual
UNION ALL SELECT '10' FROM dual
UNION ALL SELECT '1-A' FROM dual
UNION ALL SELECT '2' FROM dual
UNION ALL SELECT '3-B' FROM dual
UNION ALL SELECT '43' FROM dual
UNION ALL SELECT '3' FROM dual
UNION ALL SELECT 'B' FROM dual)
SELECT champ, TO_NUMBER(SUBSTR(champ, 0, LENGTH(champ) -NVL(LENGTH(LTRIM(champ, '0123456789')),0))) AS num,
			SUBSTR(champ, LENGTH(champ) -NVL(LENGTH(LTRIM(champ, '0123456789')),0)+1) AS car
FROM t
ORDER BY TO_NUMBER(SUBSTR(champ, 0, LENGTH(champ) -NVL(LENGTH(LTRIM(champ, '0123456789')),0))), 
		SUBSTR(champ, LENGTH(champ) -NVL(LENGTH(LTRIM(champ, '0123456789')),0)+1)
__________________
More Code : More Bugs. Less Code : Less Bugs
McM est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 11h37.


 
 
 
 
Partenaires

Hébergement Web