I. Introduction▲
Nous avons tous une langue maternelle, et certains chanceux ont des compétences complémentaires dans d'autres langues.
En informatique, la problématique est la même : on apprend un langage avec une certaine peine, mais lorsque la pratique est là, c'est le langage que l'on connaît généralement le mieux. La connaissance d'autres langages est alors plus aisée si l'on peut apprendre « par similitudes ».
L'Esperanto en SGBDR est représenté par les diverses normes SQL. Il y a cependant des différences mineures qui créent des problèmes majeurs aux développeurs censés passer d'un SGBDR à un autre : le langage de chaque SGBDR qui diffère pour écrire les objets compilés (fonctions, triggers, contraintes, procédures stockées), et les fonctions.
Voici donc un petit comparatif qui vous permettra de traduire plus aisément une fonction d'un SGBD à l'autre.
Pour la compatibilité, les acronymes suivants ont été utilisés :
- SQL = norme SQL2 ;
- ASE = Sybase Adaptive Server Enterprise (15) ;
- ASA = Sybase Adaptive Server Anywhere ;
- MS = Microsoft SQL Server (2000) ;
- OR = Oracle (10g) ;
- DB = DB2-UDB (8.2) ;
- AS = DB2-400 (V5R3) ;
- MY = MySQL (4.1) ;
- PG = PostgreSql (8.0) ;
- IN = Informix.
Si d'aventure vous vouliez enrichir cette page avec d'autres SGBDR, n'hésitez pas à me faire parvenir votre matrice de correspondance.
II. Fonctions d'agrégat▲
Action |
Fonction |
Compatibilité |
---|---|---|
Somme des champs non nulls |
Select caisse, sum(montant) from ecritures where annee=2005 group by caisse |
SQL,OR,DB,AS,ASA,MS,MY |
Nombre des champs non nulls |
Select caisse, count(montant ) from ecritures group by caisse |
SQL,OR,DB,AS,ASA,MS,MY |
Maximum |
Select max(montant) from … |
SQL,OR,DB,AS,MS,ASE,ASA,MY |
Minimum |
Select min(montant) from … |
SQL,OR,DB,AS,MS,ASE,ASA,MY |
Moyenne |
Select avg(montant) from … |
SQL,OR,DB,AS,MS,ASE,ASA,MY |
Écart type |
Select stddev(montant) from… |
OR,DB,AS,MY,PG |
Variance |
Select var(montant) from… |
DB,AS,MS |
Autres fonctions analytiques |
corr, covar_pop, covar_samp, cume_dist, dense_rank, first, first_value, lag, last, last_value,lead,ntile, percent_rank, percentile_cont, percentile_disc, rank, ration_to_report, row_number, stddev_pop, stddev_samp, var_pop, var_samp |
OR |
III. Fonctions sur chaînes de caractères▲
Action |
Fonction |
Résultat |
Compatibilité |
---|---|---|---|
Concaténation |
'A' || 'B' |
'AB' |
92,OR,DB,AS,IN,ASA |
Conversion en chaîne |
(var)char(89) |
'89' |
DB,AS |
Transformation ASCII |
char(89) |
'Y' |
MS,ASE |
Longueur d'une chaîne |
char[acter]_length('A ') |
3 |
SQL,DB,AS,MY |
Position d'une sous-chaîne |
instr('ABCDE', 'CD') |
3 |
OR,MY |
Mise en majuscules |
ucase('BonJour') |
'BONJOUR' |
DB,AS,MY |
Mise en minuscules |
lcase('BonJour') |
'bonjour' |
DB,AS,MY |
Remplissage à gauche |
lpad('A',5,'X') |
'XXXXXA' |
OR,MY |
Remplissage à droite |
rpad('A',5,'X') |
'AXXXXX' |
OR,MY |
Initiales en majuscules |
initcap('de LA molle') |
'De La Molle' |
OR |
Suppression des espaces à gauche |
ltrim(' A B ') |
'A B ' |
OR,MS,ASE,DB,AS,MY |
Suppression des espaces à droite |
rtrim(' A B ') |
' A B' |
OR,MS,ASE,DB,AS,MY |
Suppression des espaces à gauche et à droite |
trim(' A B ') |
'A B' |
SQL,OR,AS,MY |
Conversion en Unicode |
nchar(509) |
'ae' |
MS |
Recherche phonétique |
soundex('Fabien') |
'F150' |
OR,MS,ASE,AS,MY |
Génération d'espace |
space(5) |
' ' |
MS,ASE,DB,AS,MY |
Extraction d'une sous-chaîne |
substr(‘ABCDE',3,2) |
'CD' |
OR,DB,AS,MY |
Transformation de caractères |
translate('abcd', 'ac', 'xy') |
'xbyc' |
SQL,OR |
Remplacement d'une chaîne |
replace('ABC', 'AB','B') |
'BC' |
MS,DB2,AS,OR,MY |
Remplacement d'une chaîne par positionnement |
stuff('abcdef', 2, 3, 'ijklmn') |
'aijklmnef' |
MS |
Renversement d'une chaîne |
reverse('ABCD') |
'DCBA' |
ASE,MS,OR,MY |
Partie gauche d'une chaîne |
left('ABCD',2) |
'AB' |
MS,DB,AS,MY |
Partie droite d'une chaîne |
right('ABCD',2) |
'CD' |
ASE,MS,DB,AS,MY |
IV. Fonctions temporelles▲
Action |
Fonction |
Résultat |
Compatibilité |
---|---|---|---|
Conversion en date |
date('2002-01-02') |
'01/02/2002' |
AS,DB |
Ajout d'un intervalle à une date |
dateadd(M,2,'01.02.2005') |
'1 avr. 2005 0:00' |
MS,ASE |
Retrait d'un intervalle à une date |
dateadd(M,-2,'01.02.2005') |
'1 dec. 2004 0:00' |
MS,ASE |
Différence entre 2 dates |
datediff(day, '1.1.2005', '1.1.2006') |
365 |
MS,ASE |
Nom du jour |
dayname('19.7.2005') |
'Mardi' |
AS,DB |
Dernier jour du mois |
last_day('4.2.1996') |
'29.2.1996' |
OR,MY |
Conversion en heures |
time('01:00') |
'01:00:00' |
DB,AS |
Nom du mois |
monthname('19.7.2005') |
'Juillet' |
AS,DB |
Conversion en date/heure |
timestamp('2002/1/1') |
'2002-01-01-00.00.00.000000' |
DB,AS |
Date courante |
current_date |
'18/07/2005' |
SQL,OR,MY |
Heure courante |
current time |
'18:00:34' |
AS,DB |
Heure et date courantes |
now(), current timestamp |
'2005-07-18-18.29.30.303032' |
AS,DB |
Écart avec le GMT |
current timezone |
20000 |
AS |
Microseconde d'une heure |
microsecond('02:03:04.129') |
129 |
AS,DB,MY |
Extraction du trimestre d'une date |
quarter('1.7.2005') |
3 |
AS,DB,MY |
Extraction d'une partie d'une date/heure |
year(), month(), day(), |
… |
AS,DB,MY |
Prochain 2e jour de la semaine |
next_day('19.07.2005',2) |
'26.07.2005' |
OR |
No de la semaine |
week('19-7-2005') |
30 |
AS,DB,MY |
Jour de la semaine |
dayofweek('19.7.2005') |
3 |
AS,DB,MY |
Jour de l'année |
dayofyear('19.7.2005') |
200 |
AS,DB,MY |
V. Fonctions numériques▲
Action |
Fonction |
Résultat |
Compatibilité |
---|---|---|---|
Conversion en décimal |
decimal('45') |
45 |
DB,AS |
Conversion en entier |
integer('7.7') |
7 |
AS,DB |
Conversion en nombre à virgule flottante |
float(1.0/3) |
0.333333…1 |
AS |
La plus grande valeur |
greatest(5,9…) |
9 |
OR,MY |
La plus petite valeur |
least(5,9…) |
5 |
OR,MY |
Valeur absolue |
abs(-3.3) |
3.3 |
DB,AS, ASE, ASA,PG,MS,OR,MY |
Conversion en degrés |
degrees(1) |
57.29 |
AS,MY |
Conversion en digits (sans décimales) |
digits(3.56) |
365 |
AS,DB |
Conversion en digits sur 10 positions |
digits(123) |
0000000356 |
AS,DB |
Exponentiel |
exp(2) |
7.389 |
MS,OR,DB,AS,MY |
Arrondi supérieur |
ceiling(3.4) |
4 |
MS,ASE,DB,AS,MY |
Trigonométrie |
sin(.1), cos(.1), tan(.1) |
… |
MS,ASE,OR,DB,AS,MY |
Logarithme népérien |
ln(1) |
0 |
OR,DB,AS |
Logarithme en base 10 |
log(1) |
0 |
MS,DB,AS,MY |
Modulo |
mod(50,7) |
1 |
OR,DB,AS,MY |
PI |
pi() |
3.1415… |
OR,MS,ASE,DB,AS,MY |
Élévation à la puissance |
power(2,4) |
16 |
OR,MS,ASE,DB,AS,MY |
Valeur aléatoire |
rand(1) |
… |
DB,MS,ASE,AS,MY |
Arrondi |
round(4.576,2) |
4.58 |
DB,MS,ASE,OR,AS,MY |
Signe d'un nombre |
sign(-7) |
-1 |
DB,MS,OR,AS,ASE,MY |
Racine carrée |
sqrt(16) |
4 |
DB,MS,OR,AS,ASE,MY |
Troncature sans arrondi |
trunc(3.599,2) |
3.59 |
OR,DB,AS |
VI. Autres fonctions▲
Action |
Fonction |
Résultat |
Compatibilité |
---|---|---|---|
n premières lignes d'un set |
SELECT * FROM A WHERE RRN(A) < 10 |
10 premières lignes |
AS |
Fonction conditionnelle |
decode('M','M','H','F') |
'H' |
OR |
1re valeur non nulle |
coalesce(Null, 0…) |
0 |
SQL,AS,DB,OR,MS,ASE,ASA,MY |
Utilisateur courant |
current_user |
'Utilisateur' |
SQL,MS,DB,MY |
Utilisateur de la session |
session_user |
'Login' |
SQL,MS,DB,MY |
Utilisateur système |
System_user |
'Login système' |
SQL,MS,DB |