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 language avec une certaine peine, mais lorsque la pratique est là, c'est le language que l'on connaît généralement le mieux. La connaissance d'autes languages 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 sensés passer d'un SGBDR à un autre : le language 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 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) (merci à Maximilian)
- 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 |
| Ecart type | Select stddev(montant) from... | OR,DB,AS,MY,PG |
| Variance | Select var(montant) from... Select variance(montant) from... |
DB,AS,MS OR,MY,PG |
| 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' concat('A','B') 'A' + 'B' concatenate ('A','B') |
'AB' | 92,OR,DB,AS,IN,ASA OR,DB,AS,MY,PG MS,ASE,ASA SQL |
| Conversion en chaîne | (var)char(89) to_char(89) convert(char(2), 89), str(89) cast(89 as char(2)) |
'89' | DB,AS OR MS,ASE,MY SQL,MS,OR,DB,AS,MY |
| Transformation ASCII | char(89) chr(89) ASCII('Y') |
'Y' 'Y' 89 |
MS,ASE OR,PG MS,OR,MY |
| Longueur d'une chaîne | char[acter]_length('A ') length('A ') datalength('A '), len('A ') |
3 | SQL,DB,AS,MY OR,DB,AS,MY,ASA,IN,PG MS,ASE,ASA |
| Position d'une sous-chaîne | instr('ABCDE', 'CD') locate('CD', 'ABCD') patindex('%CD%', 'ABCD') position('ABCDE', 'CD') |
3 | OR,MY DB,AS,MY MS,ASE SQL,MY |
| Mise en majuscules | ucase('BonJour') upper('BonJour') |
'BONJOUR' | DB,AS,MY SQL,MS,ASE,ASA,OR,DB,AS,MY,PG |
| Mise en minuscules | lcase('BonJour') lower('BonJour') |
'bonjour' | DB,AS,MY SQL,MS,ASE,ASA,OR,DB,AS,MY,PG |
| Remplissage à gauche | lpad('A',5,'X') replicate('X',5)+'A' |
'XXXXXA' | OR,MY MS,ASE |
| Remplissage à droite | rpad('A',5,'X') 'A'+replicate('X',5) |
'AXXXXX' | OR,MY MS,ASE |
| Initiales en majuscules | initcap('de LA molle') translate('de LA molle') |
'De La Molle' | OR SQL |
| 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 ') ltrim(rtrim(' A B ')) |
'A B' | SQL,OR,AS,MY MS,ASE,OR,DB,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) lpad('',5,' ') |
' ' | MS,ASE,DB,AS,MY OR |
| Extraction d'une sous-chaîne | substr(‘ABCDE',3,2) substring(‘ABCDE',3,2) |
'CD' | OR,DB,AS,MY SQL,MS,ASE,MY |
| Transformation de caractères | translate('abcd', 'ac', 'xy') translate('abcd', 'xy', 'ac') |
'xbyc' | SQL,OR DB,AS |
| Remplacement d'une chaîne | replace('ABC', 'AB','B') str_replace('ABC', 'AB','B') |
'BC' | MS,DB2,AS,OR,MY ASE |
| Remplacement d'une chaîne par positionnement | stuff('abcdef', 2, 3, 'ijklmn') left('abcdef',1)+ 'ijklmn'+right('abcdef', datalength('abcdef')-4) instr('abcdef',1)||'ijklmn'||instr('abcdef', -4) |
'aijklmnef' | MS MS,ASE OR |
| Renversement d'une chaîne | reverse('ABCD') | 'DCBA' | ASE,MS,OR,MY |
| Partie gauche d'une chaîne | left('ABCD',2) substring('ABCD',0,2) substr('ABCD',1,2) |
'AB' | MS,DB,AS,MY ASE,ASA,IN OR |
| Partie droite d'une chaîne | right('ABCD',2) substr('ABCD',-2) |
'CD' | ASE,MS,DB,AS,MY OR |
IV. Fonctions temporelles▲
| Action | Fonction | Résultat | Compatibilité |
|---|---|---|---|
| Conversion en date | date('2002-01-02') to_date('2002-01-02') cast('2002-01-02' as ...) str_to_date('2002-01-02', ...) |
'01/02/2002' | AS,DB OR SQL,AS,DB,OR,MS,MY,ASA,IN MY |
| Ajout d'un intervalle à une date | dateadd(M,2,'01.02.2005') dateadd, adddate('01.02.2005', INTERVAL 2 MONTH), '01.02.2005'+interval 2MONTH |
'1 avr. 2005 0:00' | MS,ASE SQL,MY,OR,IN,MS,ASA |
| Retrait d'un interval à une date | dateadd(M,-2,'01.02.2005') date_sub('1.2.2005', INTERVAL 30 DAY) '1.2.3005' - 2 month |
'1 dec. 2004 0:00' | MS,ASE MY DB,AS,ASA,IN,MS,OR |
| Différence entre 2 dates | datediff(day, '1.1.2005', '1.1.2006') datediff('1.1.2005', '1.1.2006') days(date('1.1.2005'))-days(date('31.12.2005')) |
365 | MS,ASE MY AS,DB |
| Nom du jour | dayname('19.7.2005') datename(d,'19.7.2005') date_format('19.7.2005', '%W'), dayname('19.7.2005') |
'Mardi' | AS,DB MS,ASE |
| Dernier jour du mois | last_day('4.2.1996') dateadd(D,-1,convert(datetime,'1.'+datepart(M,dateadd(M,1,'4.2.1996'))+'.'datepart(Y,'4.2.1996'))) |
'29.2.1996' | OR,MY MS,ASE |
| Conversion en heure | time('01:00') | '01:00:00' | DB,AS |
| Nom du mois | monthname('19.7.2005') datename(m,'19.7.2005') date_format('19.7.2005', '%M'), month('19.7.2005') |
'Juillet' | AS,DB MS,ASE MY |
| Conversion en date/heure | timestamp('2002/1/1') to_timestamp('2002/1/1') convert(timestamp, '2002/1/1') |
'2002-01-01-00.00.00.000000' | DB,AS OR MS,ASE |
| Date courante | current_date current date getdate() curdate(), now() today() |
'18/07/2005' | SQL,OR,MY DB,AS,ASA MS,ASE MY IN |
| Heure courante | current time current_time getdate() curtime() CURRENT_TIMESTAMP |
'18:00:34' | AS,DB SQL,MY MS,ASE MY MS |
| Heure et date courantes | now(), current timestamp current_timestamp getdate() current_timestamp() current() |
'2005-07-18-18.29.30.303032' | AS,DB OR,AS,MS SQL,MS,ASE MY IN |
| Écart avec le GMT | current timezone current_timestamp datediff(hh, getutcdate(),getdate()) |
20000 ... +02:00 2 |
AS OR MS,ASE |
| Microseconde d'une heure | microsecond('02:03:04.129') datepart(ms,'02:03:04.129') date_format('02:03:04.129', '%f') |
129 | AS,DB,MY MS,ASE MY |
| Extraction du trimestre d'une date | quarter('1.7.2005') datepart(q, '1.7.2005') |
3 | AS,DB,MY MS,ASE |
| Extraction d'une partie d'une date/heure | year(), month(), day(), hour(), minutes(), second() datepart(hh, '1.1.2005 05:04:03') extract(hour from '1.1.2005 05:04:03') date_format('1.1.2005 05:04:03', '%h') |
... | AS,DB,MY AS,DB,MY MS,ASE OR,MY MY |
| Prochain 2ème jour de la semaine | next_day('19.07.2005',2) | '26.07.2005' | OR |
| No de la semaine | week('19-7-2005') datepart(ww, '19-7-2005') date_format('19-7-2005', '%V') to_number(to_char(to_date('19.7.2005'),'IW')) |
30 | AS,DB,MY MS,ASE MY OR |
| Jour de la semaine | dayofweek('19.7.2005') datepart(w, '19.7.2005') date_format('19.7.2005', '%w') |
3 2 |
AS,DB,MY MS,ASE MY |
| Jour de l'année | dayofyear('19.7.2005') datediff(d,'1.1.2005','19.7.2005')+1 date_format('19.7.2005', '%j') |
200 | AS,DB,MY MS,ASE MY |
V. Fonctions numériques▲
| Action | Fonction | Résultat | Compatibilité |
|---|---|---|---|
| Conversion en décimal | decimal('45') convert(dec(9,2), '45') to_number('45') convert('45', decimal) cast('45' as decimal) |
45 | DB,AS MS,ASE OR MY MS,MY |
| Conversion en entier | integer('7.7') cast(7.6 as integer) cast(7.6 as integer) cast(7.6 as signed/unsigned) |
7 7 8 8 |
AS,DB AS,DB,MS,ASE OR MY |
| Conversion en nombre à virgule flottante | float(1.0/3) cast(1/0.3 as float) convert(float, 1/0.3) |
0.333333...1 | AS AS,DB,MS,SQL,OR MS,ASE |
| 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) convert(int, (str_replace(convert(varchar(30), 3.56),'.',''))) cast((replace(cast ( 3.56 as varchar(30)),'.','')) as int) replace(3.56,'.','') |
365 | AS,DB ASE MS OR |
| Conversion en digits sur 10 positions | digits(123) RIGHT('0000000000'+convert(varchar(10),123),10) substr('0000000000'||123 ),-10) |
0000000356 | AS,DB MS,ASE OR |
| Exponentiel | exp(2) | 7.389 | MS,OR,DB,AS,MY |
| Arrondi supérieur | ceiling(3.4) ceil(3.4) |
4 | MS,ASE,DB,AS,MY OR,MY |
| Trigonométrie | sin(.1), cos(.1), tan(.1) asin(.1), acos(.1), atan(.1) sinh(.1), cosh(.1), tanh(.1) cot(.1) atan2(.3,.2) |
... | MS,ASE,OR,DB,AS,MY MS,ASE,OR,DB,AS,MY OR,DB,AS MS,ASE,DB,AS,MY OR,MY |
| Logarithme népérien | ln(1) LOG2() |
0 | OR,DB,AS MY |
| Logarithme en base 10 | log(1) log10(1) log(1,10) |
0 | MS,DB,AS,MY MS,ASE,DB,AS,MY OR |
| Modulo | mod(50,7) 50 % 7 |
1 | OR,DB,AS,MY MS,ASE,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) round(4.574,2) |
4.58 4.57 |
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) truncate(3.599,2) |
3.59 | OR,DB,AS MS,ASE,DB,AS,MY |
VI. Autres fonctions ▲
| Action | Fonction | Résultat | Compatibilité |
|---|---|---|---|
| n premières lignes d'un set | SELECT * FROM A WHERE RRN(A) < 10 SELECT * FROM A FETCH FIRST 10 ROWS ONLY SELECT TOP 10 * FROM A SELECT * FROM A WHERE ROWNUM < 10 SELECT * FROM A LIMIT 0,10 |
10 premières lignes | AS DB MS,ASE,ASA OR MY |
| Fonction conditionnelle | decode('M','M','H','F') Value ('M','M','H','F') case 'M' when 'M' then 'H' else 'F' end |
'H' | OR DB,AS SQL,OR,MS,ASE,ASA,IN,DB,AS,MY |
| 1ère valeur non nulle | coalesce(Null, 0, ...) isnull(NULL,0) Nvl(NULL,0) NULLIF(NULL,0) |
0 | SQL,AS,DB,OR,MS,ASE,ASA,MY OR,AS,ASA,DB,MS,ASE OR,IN SQL,ASA,ASE,MS |
| Utilisateur courant | current_user User user_name() user_sname() |
'Utilisateur' | SQL,MS,DB,MY OR ASE MS |
| Utilisateur de la session | session_user suser_name() suser_sname() user() |
'Login' | SQL,MS,DB,MY ASE MS MY |
| Utilisateur système | System_user Userenv |
'Login système' | SQL,MS,DB OR |















