Mémo SQL
* => nouveauté 7.4 |
Ordres de base (Voyez aussi la version PDF ou la doc IBM)
SQL 89
|
|
||||||||||||||
SQL
92 |
WHERE [sélection]
options de limitation
|
||||||||||||||
(tables dérivées) | Soit
|
||||||||||||||
(Requête récursive) | WITH temp (chef, matricule, nom) |
||||||||||||||
(Requête hiérarchique) | SELECT chef, matricule, nom
|
||||||||||||||
(Tables temporelles) | -- comme si nous étions le 10 Février 2016 Select * From fichier |
||||||||||||||
UPDATE (-> V4R20) |
UPDATE fichier SET colonne1 = valeur1 |
||||||||||||||
UPDATE (V4R30 et +) |
UPDATE fichier f SET colonne1 = |
||||||||||||||
INSERT |
|
||||||||||||||
INSERT + FINAL TABLE |
SELECT cle_auto, quand FROM FINAL TABLE (INSERT INTO fournisseur |
||||||||||||||
DELETE | DELETE FROM fichier WHERE [sélection] |
||||||||||||||
TRUNCATE (CLRPFM) | TRUNCATE TABLE CLIENTP1 DROP STORAGE IGNORE DELETE TRIGGERS RESTART IDENTITY |
||||||||||||||
VALUES | VALUES now() -- affiche le timestamp en cours |
||||||||||||||
MERGE | MERGE INTO cible C |
||||||||||||||
Concurrence d'accès pour SELECT, UPDATE, DELETE et MERGE | Suivant le niveau de commitment control |
–Sélections
Opérateur logique | Exemple(s) | ||
|
QTECDE <> 0 |
||
les valeurs peuvent être comparées en ligne | ... where (cepage1, cepage2) = ('Syrah' , 'Grenache') |
||
IN (val1, val2, val3, ...) | DEPT IN (44, 49, 22, 56, 29) |
||
BETWEEN val1 AND val2 | DEPT BETWEEN 44 AND 85 |
||
LIKE |
aussi : nom LIKE '%'concat ville concat '%' |
||
IS NULL | ISNULL * IS NOT NULL [ NOTNULL * |
test la valeur nulle (pratique avec les jointures externes) |
||
et aussi OR, AND, NOT, (, ). | CODART = 1245 or LIBART = 'Pamplemousse' |
||
REGEXP_LIKE(zone, <expression régulière>) |
|
||
IS (NOT) JSON |
|
||
JSON_EXISTS |
|
||
EXISTS |
|
–Fonctions scalaires (ligne à ligne)
Fonction(x) | Retourne ? | Exemple |
MAX(X,Y) | retourne la plus grande valeur de X ou de Y | MAX(prixHA, pritarif) * qte |
MIN(X,Y) | retourne la plus petite valeur de X ou de Y | MIN(datce, datliv) |
ABSVAL(x) | la valeur absolue de x | ABSVAL(prix) * qte |
CEIL(x) | Retourne l'entier immédiatement supérieur à X | CEIL(2,42) = 3 |
FLOOR(x) | Retourne l'entier immédiatement inférieur à X | FLOOR(2,42) = 2 |
RAND() | RANDOM() * | Retourne un nombre aléatoire | |
ROUND(x , y) | Retourne l'arrondi comptable à la précision y | ROUND(2,42 , 1) = 2,40 |
SIGN(x) | Retourne -1 si x est négatif, 1 s'il est positif, 0 s'il est null | Where SIGN(x) = -1 |
TRUNCATE(x , y) | Retourne le chiffre immédiatement
inférieur à X (à la précision y) |
TRUNCATE(2,42 , 1) = 2,40 |
DEC(x , l, d) | x au format numérique packé avec la lg et la précision demandée. | DEC(zonebinaire) ) |
DIGITS(x) | x en tant que chaîne de caractères | DIGITS(datnum) |
CHAR(x) | x en tant que chaîne de car. (x étant une date) | CHAR(current date) |
CHAR(V) | V en tant que CHAR (V étant un VARCHAR) | CHAR(zonevariable) |
VARCHAR_FORMAT(X) | retourne en VARCHAR une chaîne CHAR |
Select VARCHAR_FORMAT(PR_NOM) from producteurs |
VARCHAR_FORMAT(X , 'unmasque') | retourne en chaine une information numérique
|
VALUES VARCHAR_FORMAT(1,5 - 1,4, '0D0') -> '0,1' |
BLOB(x) | une chaîne de car. (x) en tant que BLOB | BLOB('texte de la chaine à convertir') |
CLOB(x) | TO_CLOB(x) * | une chaîne de car. (x) en tant que CLOB | CLOB('texte de la chaine à convertir') |
FLOAT(x) | x au format "virgule flottante" | FLOAT(qte) |
INT(x) | x au format binaire | INT(codart) |
ZONED(x) | x au format numérique étendu | ZONED(prix) |
CAST(x as typeSQL[lg]) | x au format indiqué par typeSQL : types valides : |
CAST(qte AS CHAR(9)) Attention les zéros de gauche sont éliminés CAST(prixchar as NUMERIC(7,
2)) cast('123456,89'
as numeric(7,
2)) (trop d'entiers) |
INTERPRET(x AS typeSQL[lg]) * |
force SQL à "caster" une chaîne, selon le type indiqué | Select interpret(substr(entry_data , 1 , 4) as integer) |
STRIP |
TRIM(x ) RTRIM(x [, 'c']) LTRIM(x [, 'c']) |
supprime les blancs d' extrémité • les blancs (ou 'c') de droite • les blancs (ou 'c') de gauche |
TRIM(raisoc) |
LENGTH(x) ou |
la longueur de x | LENGTH(nom) |
CONCAT(x , y) | concatene X et Y (aussi x CONCAT y ou X || Y) | CONCAT(nom, prenom) |
SUBSTR(x, d, l) | extrait une partie de x depuis D sur L octets | SUBSTR(nom, 1, 10) |
LEFT(x, l) | STRLEFT(x,l) * | extrait une partie de x depuis 1 sur L octets | LEFT(nom, 10) |
RIGHT(x, l) | STRRIGHT(x,l) * | extrait les L derniers octets de x | RIGHT(nom, 5) |
SPACE(n) | retourne n blancs | nom concat space(5) concat prenom |
REPEAT(x , n) | retourne n fois x | repeat('*', 15) |
RPAD(chaine , n , 'c') |
Complète une chaîne à droite par le caractère indiqué (c) jusqu'à longueur de n | RPAD(PR_TEL, 15, '.') |
LPAD(chaine , n , 'c') |
Complète une chaîne à gauche par le caractère indiqué (c) jusqu'à longueur de n | LPAD(PR_TEL, 15, '-') |
MOD(x, y) | le reste de la division de x par y | MOD(annee, 4) |
RRN(fichier) | N° de rang en décimal | RRN(clientp1) |
RID(fichier) | N° de rang en binaire | RID(clientp1) |
HASH_ROW(fichier) * | retourne la valeur du codage SHA512 d'une ligne | select rrn(C), HASH_ROW(C) from clientp1 C |
TRANSLATE(x) |
X en majuscule | WHERE |
LOWER(x) LCASE(x) |
x en minuscule | WHERE |
TRANSLATE( x, remplace, origine) | Remplace tous les caractères de X présent dans origine par le caractère de même position dans remplace. | TRANSLATE(prixc, ' €', '0$') |
REPLACE( x, origine, remplacement) | Remplace la chaîne de caractère origine par la chaîne remplacement dans x | REPLACE(x, 'Francs' , 'Euros') |
REPLACE( x, origine) | Supprime la chaîne de caractère origine | REPLACE(x, 'Francs' ) --supprime Francs |
SOUNDEX( x) | Retourne le SOUNDEX (représentation phonétique) de X [basé sur un algorithme anglo-saxon] | Where SOUNDEX(prenom) = SOUNDEX('Henri') |
DIFFERENCE( x) | Retourne l'écart entre deux
SOUNDEX [0 = très différents, 4 = trés proches] |
Where DIFFERENCE(prenom, 'HENRI)>
2 |
COALESCE(x,yz) |
NVL(x,yz) * |
retourne la première valeur non nulle | COALESCE(DEPCLI, DEPLIV, 0) |
IFNULL(x, y) | VALUE(x, y) | retourne X s'il est non null, sinon Y | IFNULL(DEPT, 0) -- comme COALESCE mais avec 2 arguements |
NULLIF(x, y) | retourne NULL si X = Y | NULLIF(Prix, 0) |
LOCATE(x , y [,d]) POSSTR(y , x) |
retourne la position à laquelle x est présent
dans y ou 0 (LOCATE, la recherche commence en d, qui est facultatif) |
LOCATE(' ', raisoc) |
POSITION(x IN y) | retourne la position à laquelle x est présent dans y ou 0 | POSITION(' ' IN raisoc) |
LOCATE_IN_STRING(y, x, D, [N]) | retourne la position de la Nème occurrence de x dans y à partir de D (si D vaut -1, recherche droite vers gauche) | LOCATE_IN_STRING('Bonjour', 'o', 1 , 2) -> 5 --> 2ème o |
INSERT(x, d, nb, ch) | insert ch dans x à la position d, en remplaçant nb octets (0 admis) | |
OVERLAY(x, ch, d, [nb]) | insert ch dans x à la position d, en remplaçant nb octets (facultatif) | OVERLAY('DB2 sur x est incroyable' , 'IBMi' , 9) -> 'DB2 sur IBMi ..' |
DATABASE() | retourne le nom de la base (enregistré par WRKRDBDIRE) | |
ENCRYPT_RC2(x, p, a) | Encrypte x en utilisant p comme mot de passe |
ENCRYPT_RC2(data, 'systemi', 'avant IBMi') |
ENCRYPT_TDES(x, p, a) | Encrypte (algorithme TDES) x en utilisant p comme mot
de passe |
ENCRYPT_TDES(data, 'systemi', 'avant IBMi') |
ENCRYPT_AES(x, p, a) | Encrypte (algorithme AES) x en utilisant p comme mot de passe |
ENCRYPT_AES(data, 'systemi', 'avant IBMi') |
GETHINT(x) | retrouve l'astuce associée à x |
GET-HINT(data) --> 'avant IBMi' |
DECRYPT_BIT(x, [pwd]) | retourne (en varchar for bit data) les données
d'origine de x. |
|
DECRYPT_BINARY(x, [pwd]) | retourne (en binary) les données
d'origine de x. |
|
DECRYPT_CHAR(x, [pwd]) | retourne (en VARCHAR) les données
d'origine de x. |
|
VERIFY_GROUP_FOR_USER() | retourne 1 si l'utilisateur appartient à l'un des groupes indiqués, 0 sinon. |
+--SESSION_USER--+ |
IDENTITY_VAL_LOCAL() | retourne la dernière valeur assigné à une zone avec l'attribut AS IDENTITY |
|
HEX(chaine) | retourne la valeur hexa d'un chaine |
HEX('bonjour') -> 8296959196A499 X'8296959196A499' -> Bonjour |
VARBINARY_FORMAT() | Retourne la suite binaire formattée |
varbinary_format('A7B37D20-915D-45C4-8D0B-B5AA0F864FCA', |
VARCHAR_FORMAT_BINARY() | retourne la valeur hexa, formatée, d'une chaîne. |
VALUES VARCHAR_FORMAT_BINARY('123456789abcdef0', |
CASE when ... then .. when ... then .. [else] END |
retourne la valeur du premier THEN ayant la clause WHEN de vérifiée. |
|
–Fonctions d'agrégation (fonctions de groupe)
Fonction(x) | Retourne ? | Exemple |
MAX(X) | retourne la plus grande valeur du groupe | MAX(DATLIV) |
MIN(X) | retourne la plus petite valeur du groupe | MIN(prix) |
AVG(x) | la moyenne de X pour un groupe de ligne | AVG(quantite) |
STDDEV(X) | retourne l'écart type | |
VAR(X) | retourne la variance | |
COUNT(*) | le nombre de lignes sélectionnées |
|
COUNT(X) | le nombre de lignes ou X est non null | COUNT(NOCLI) |
COUNT(DISTINCT X) | le nombre de valeurs différentes rencontrées pour X | COUNT(distinct nocli) |
SUM(x) | retourne la somme de X | SUM(qte * prix) |
COVARIANCE(x , y) | Indique si X et Y évoluent en même temps (en unités) | COVARIANCE(meteo, ventedeglace) |
CORRELATION(x , y) | Indique si X et Y évoluent en même temps (entre -1 et 1) | CORRELATION(PIB, GES) |
MEDIAN(X) | Valeur medianne de X | MEDIAN(salaire) |
PERCENTILE_CONT(X) | retourne le pourcentille : PERCENTILLE(0,5) = MEDIAN() | PERCENTILE_CONT(0,1) within group |
PERCENTILE_DISC(X) | retourne le pourcentille discret (si nb de lignes paire -> retourne la 1ere valeur) |
PERCENTILE_DISC(0,1) within group |
REGR_COUNT(x , y) | Droite de régression, nbr de paires non nulles | |
REGR_INTERCEPT(x , y) | Droite de régression, ordonnée à l'origine (valeur de x quand y =0) | |
REGR_R2(x , y) | Droite de régression, coéfficient de détermination (écart moyen / droite) | REGR_R2(PIB, GES) // 1 = tous les points sur la droite |
REGR_SLOPE(x , y) | Droite de régression, pente de la droite théorique | REGR_SLOPE(PIB, qualiteAIR) //-1= pente descendante |
REGR_AVGX(x , y) | Droite de régression, moyenne de X sans les valeurs nulles | |
REGR_AVGY(x , y) | Droite de régression, moyenne de Y sans les valeurs nulles | |
REGR_SXX(x , y) | REGR_COUNT(X, Y) * VARIANCE(Y) | |
REGR_SXY(x , y) | REGR_COUNT(X, Y) * COVARIANCE(X, Y) | |
REGR_SYY(x , y) | REGR_COUNT(X, Y) * VARIANCE(X) | |
LISTAGG( x, 's') | concatene toutes les occurrences de X (avec s comme séparateur) | SELECT pr_nom , LISTAGG(vin_nom, ',') WITHIN GROUP (order by vin_code) AS LESNOMS FROM producteur join vins Using(pr_code) GROUP BY pr_code, pr_nom |
SYSTOOLS.SPLIT(C, 's') * | désérialise toutes les occurrences de X dans C (selon le séparateur s) | SELECT * from TABLE(systools.split(LESNOMS, ',') ) |
–Fonctions OLAP
ROW_NUMBER() | numérote les lignes affichées |
|
||||||||||||||||||||||||||||||||
numérote les lignes sur un critère de tri (ici le prix) |
|
|||||||||||||||||||||||||||||||||
numérote les lignes sur un tri (le prix) à l'intérieur d'une même famille |
|
|||||||||||||||||||||||||||||||||
RANK() | attribue un rang unique à chaque ligne, en gérant les ex-aequo |
select RANK() over ([Partition by..] order by prix),
codart, libart
from articles |
||||||||||||||||||||||||||||||||
DENSE_RANK() | attribue un rang unique et consécutif (sans trou) à chaque ligne |
select DENSE_RANK() over ([Partition by..] order by prix),
codart, libart from articles |
||||||||||||||||||||||||||||||||
PERCENT_RANK() | Retourne le % du rang (entre 0 et 1) |
select PERCENT_RANK() over ([Partition by..] order by prix),
codart, libart from articles |
||||||||||||||||||||||||||||||||
LAG(X) | Retourne la valeur de X de la ligne du dessus |
select Annee, CA , (CA - LAG(CA) over (order by annee) ) as evolution FROM factures |
||||||||||||||||||||||||||||||||
LEAD(X) | Retourne la valeur de X de la ligne du dessous |
|||||||||||||||||||||||||||||||||
NTILE(X) | Retourne la quantile (NTILE(10) = le décille) |
select NTILE(3) over (order by cacli ) , |
||||||||||||||||||||||||||||||||
CUME_DIST(X) | Retourne la distribution cumulée (le dernier vaut 1) |
select cume_dist() over (order by cacli ) , |
||||||||||||||||||||||||||||||||
FIRST_VALUE(X) | Retourne la première valeur de X suivant le tri |
select CACLI ,
cacli / first_value(cacli) over (order by cacli) AS NBRDEFOISPLUS
FROM clients |
||||||||||||||||||||||||||||||||
LAST_VALUE(X) | Retourne la dernière valeur de X suivant le tri |
select CACLI ,
cacli / LAST_value(cacli) over (order by cacli) AS NBRDEFOISMOINS FROM clients |
||||||||||||||||||||||||||||||||
NTH_VALUE(X, N) | Retourne la Nième valeur de X suivant le tri |
|||||||||||||||||||||||||||||||||
RATIO_TO_REPORT(X) | Retourne le % de la somme cumulée |
select CACLI , RATIO_TO_REPORT(cacli) over (order by cacli) AS RATIO FROM clients |
||||||||||||||||||||||||||||||||
soit le SELECT basique suivant --> |
SELECT SOC, DEP, Count(*) .../... GROUP
BY soc, Dep
|
|||||||||||||||||||||||||||||||||
GROUPING SETS | affiche les totaux pour 2 GROUPES consécutifs |
SELECT SOC, DEP, Count(*) ...GROUP BY Grouping Sets (soc, Dep)
|
||||||||||||||||||||||||||||||||
ROLLUP | affiche 1 total par groupe puis des ruptures de niveau supérieur |
SELECT SOC, DEP, Count(*) ... GROUP BY ROLLUP (soc,
Dep)
|
||||||||||||||||||||||||||||||||
CUBE | affiche les totaux pour tous les groupes possibles |
SELECT SOC, DEP, Count(*) GROUP BY CUBE (soc, Dep)
|
||||||||||||||||||||||||||||||||
GROUPING() | indique si cette ligne est le résultat de ROLLUP (rupture) |
SELECT SOC, DEP, Count(*), GROUPING(DEP) GROUP BY ROLLUP (soc, Dep)
|
||||||||||||||||||||||||||||||||
7.3 : options d'agrégation | les fonctions d'agrégation peuvent être utilisées comme des fonctions OLAP (avec OVER) et sans GROUP BY |
SELECT codart, prix, sum(prix) over(order by codart) from articles
|
–Fonctions XML
XMLDOCUMENT() | production d'un flux XML à partir d'une chaîne de caractère. |
|
XMLPARSE() | production après vérification, d'un flux XML, avec choix de conservation des espaces ou non |
XMLPARSE(DOCUMENT '<xml> ... </xml>') PRESERVE WHITESPACE |
XMLVALIDATE() | validation d'un flux XML à l'aide d'un schéma XSD enregistré dans XSROBJECTS |
XMLVALIDATE(DOCUMENT '<xml> ... </xml>' ACCORDING TO XMLSCHEMA <schema>) |
XSLTRANSFORM( ) | transforme un flux XML à l'aide de XSLT |
XSLTRANSFORM( flux-xml USING 'source-XSLT') |
XMLTEXT( ) | retourne un texte compatible XML |
select XMLTEXT('100 est > à 99 & à 98') FROM SYSIBM.SYSDUMMY1 ; ==> 100 est > à 99 & à 98 |
XMLELEMENT( ) | production d'un élément XML |
select XMLELEMENT(name "numero" , nocli) from clients <numero>1</numero> |
XMLNAMESPACE( ) | génération d'un espace de nommage | select xmlelement(name "client:nom", XMLNAMESPACES('http://www.volubis.fr/clients/1.0' AS "client") , <client:nom xmlns:client="http://www.volubis.fr/clients/1.0">IBM</client:nom> |
XMLPI( ) | balise processing instruction | SELECT XMLPI(NAME "Instruction", 'APPUYEZ SUR ENTREE') <?Instruction APPUYEZ SUR ENTREE?>
|
XMLCOMMENT, | commentaire XML | select XMLCOMMENT('A consommer avec modération') <!--A consommer avec modération-->
|
XMLCONCAT( ) | Concatenation de deux flux XML | select XMLCONCAT( XMLELEMENT(name "numero", nocli) , XMLELEMENT(name "nom", raisoc) ) from clients <numero>1</numero><nom>IBM</nom> |
XMLFOREST( ) | Suite d'éléments XML à partir des colonnes d'une table | select XMLFOREST(nocli , raisoc) from clients <NOCLI>1</NOCLI><RAISOC>IBM</RAISOC> |
XMLROW( ) | arborescence XML à partir des colonnes d'une table | select XMLROW(nocli , raisoc) from clients <row> <NOCLI>1</NOCLI><RAISOC>IBM</RAISOC> </row> |
XMLAGG( ) | Fonction d'agrégation, éléments XML par groupe (GROUP BY) ou pour la totalité du fichier fichier (sans GROUP BY) | select xmlagg(XMLELEMENT(name "nom" , raisoc)) from clients <nom>IBM</nom><nom>Rational</nom> .... |
XMLGROUP( ) | Fonction d'agrégation, arborescences XML par groupe (GROUP BY) ou pour la totalité du fichier fichier (sans GROUP BY) | select xmlgroup(XMLELEMENT(name "nom" , raisoc)) from clients <rowset> |
XMLTABLE( ) | Fonction Table qui traite sous forme colonnée (relationnelle), les éléments d'un flux XML. La source peut être :
|
SELECT X.NOM, X.RUE, X.TEL FROM |
–Fonctions JSON
JSON_TABLE( ) | Fonction Table qui traite sous forme colonnée (relationnelle), les éléments d'un flux JSON. La source peut être :
|
SELECT X.NOM, X.RUE, X.TEL FROM |
JSON_VALUE( ) | retourne une valeur scalaire (unitaire) |
VALUES(JSON_VALUE( Json_VAR, '$.id' RETURNIN Integer) ==> 901; |
JSON_QUERY( ) | retourne une chaîne au format JSON |
VALUES(JSON_QUERY( Json_VAR, '$.name') => {"first":"John","last:"Doe"}; |
JSON_ARRAY( ) | Produit un tableau de valeur (rappel entre [ et ] ) |
VALUES(JSON_ARRAY( (SELECT DEPTNO FROM DEPT WHERE DEPTNAME LIKE 'BRANCH OFFICE%'))); ==> ["F22","G22","H22","I22","J22"] |
JSON_OBJECT( ) | produit un objet JSON, |
SELECT JSON_OBJECT('Nom' : LASTNAME,
'date naissance' : HIREDATE, 'Salaire' SALARY) FROM EMPLOYEE WHERE EMPNO = '000020' ==>{"Nom":"THOMPSON","date naissance":"1973-10-10","Salaire":41250.00} |
JSON_ARRAYAGG( ) | produit un tableau de valeurs par groupe (GROUP BY) |
SELECT workdept, JSON_ARRAYAGG(lastname) FROM EMPLOYEE WHERE workdept LIKE 'D%' GROUP BY workdept; |
JSON_OBJECTAGG( ) | produit une série d'objets JSON (clé/valeur) par groupe (GROUP BY) |
SELECT JSON_OBJECTAGG(workdept, JSON_OBJECTAGG(char(empno) value lastname) FROM EMPLOYEE WHERE workdept LIKE 'D%' GROUP BY workdept; |
Vous pouvez aussi utiliser les nouvelles fonctions SQL pour insérer du XML dans une table :
GET_BLOB_FROM_FILE(chemin , option) | retourne un BLOB LOCATOR, sans conversion du CCSID |
GET_CLOB_FROM_FILE(chemin , option) | retourne un CLOB LOCATOR dans le CCSID du job |
GET_DBCLOB_FROM_FILE(chemin , option) | retourne un DBCLOB LOCATOR dans le CCSID DBCS par défaut |
GET_XML_FILE(chemin) | retourne un BLOB LOCATOR en UTF-8, si ce dernier ne possède pas de déclaration XML la fonction l'ajoute. |
-> s'utilisent aussi en programmation | EXEC SQL values cast(GET_CLOB_FROM_FILE('/monfichier.txt') as varchar(20000) ) into :variable; |
–Fonctions HTTP de Systools
HTTPHEAD(url, httpheader ou chaine vide ['']) | passe une requête HTTP retourne l'entête HTTP (header) retournée par le serveur |
HTTPBLOB(url, GET | POST | PUT |DELETE, httpheader, [data] ) | passe une requête HTTP avec la méthode indiquée et retourne la réponse sous forme de BLOB |
HTTPCLOB(url, GET | POST | PUT |DELETE, httpheader, [data] ) | passe une requête HTTP avec la méthode indiquée et retourne la réponse sous forme de CLOB |
HTTPGETBLOB(url, httpheader ou chaine vide ['']) | passe une requête HTTP avec la méthode GET et retourne la réponse sous forme de BLOB |
HTTPGETCLOB(url, httpheader ou chaine vide ['']) | passe une requête HTTP avec la méthode GET et retourne la réponse sous forme de CLOB |
HTTPPOSTBLOB(url, httpheader ou chaine vide [''],data) | passe une requête HTTP avec la méthode POST et retourne la réponse sous forme de BLOB |
HTTPPOSTCLOB(url, httpheader ou chaine vide [''],data) | passe une requête HTTP avec la méthode POST et retourne la réponse sous forme de CLOB |
HTTPPUTBLOB(url, httpheader ou chaine vide [''],data) | passe une requête HTTP avec la méthode PUTet retourne la réponse sous forme de BLOB |
HTTPPUTCLOB(url, httpheader ou chaine vide ['']),data | passe une requête HTTP avec la méthode PUTet retourne la réponse sous forme de CLOB |
HTTPDELETEBLOB(url, httpheader ou chaine vide ['']) | passe une requête HTTP avec la méthode DELETE et retourne la réponse sous forme de BLOB |
HTTPDELETECLOB(url, httpheader ou chaine vide ['']) | passe une requête HTTP avec la méthode DELETE et retourne la réponse sous forme de CLOB |
URLENCODE(chaine, encodage [UTF-8 par défaut]) | retourne la chaîne au format compatible avec une URL |
URLDECODE(chaine, encodage [UTF-8 par défaut]) | retourne la chaîne en clair |
BASE64ENCODE(chaine) | retourne la chaîne au format base64 (utilisé dans les entêtes HTTP pour l'authentification) |
BASE64DECODE(chaine) | retourne la chaîne en clair |
-- exemple, retourne la liste des taux de change avec l'EURO depuis la banque centrale Européenne : |
|
--Toutes ces fonctions sont aussi livrées en mode "verbeux" |
–Fonctions HTTP de QSYS2
HTTP_GET(url, httpheader) | passe une requête HTTP avec la méthode GET et retourne la réponse sous forme de CLOB |
HTTP_POST(url, httpheader, data) | passe une requête HTTP avec la méthode POST et retourne la réponse sous forme de CLOB |
HTTP_PUT(url, httpheader) | passe une requête HTTP avec la méthode PUT et retourne la réponse sous forme de CLOB |
HTTP_DELETE(url, httpheader) | passe une requête HTTP avec la méthode DELETE et retourne la réponse sous forme de CLOB |
URL_ENCODE(chaine) | retourne la chaîne au format compatible avec une URL (encodage UTF-8) |
URL_DECODE(chaine) | retourne la chaîne en clair (encodage UTF-8) |
BASE64_ENCODE(chaine ou binaire) | retourne la chaîne au format base64 (utilisé dans les entêtes HTTP pour l'authentification) |
BASE64_DECODE(chaine) | retourne la chaîne ou valeur binaire décodée |
--Toutes ces fonctions sont aussi livrées en mode "verbeux" |
–Expressions régulières
REGEXP_COUNT() | Compte le nombre de fois ou une expression régulière est vraie |
Where REGEXP_COUNT(pr_nom , 'ch[aâ]teau') > 1 // présent au moins 2 fois |
REGEXP_INSTR() | retourne la position de la chaîne où l'expression régulière est vraie |
Where REGEXP_INSTR(pr_nom , 'ch[aâ]teau') > 5 // Chateau après position 5 |
REGEXP_SUBSTR() | retourne la chaîne qui fait que l'expression régulière est vraie |
VALUES REGEXP_SUBSTR(msg , '(\w+\.)+((org)|(com)|(gouv)|(fr))') |
REGEXP_REPLACE() | remplace la chaîne qui fait que l'expression régulière est vraie |
REGEXP_REPLACE(pr_nom , 'ch[aâ]teau' , 'bodega') |
Les deux fonctions suivantes sont disponibles, si vous avez installé Omnifind (5733OMF) et créé un Index (CALL SYPROCS.SYSTS_CREATE)
CONTAINS(zone, 'recherche') | retourne 1 si la recherche est présente dans zone |
SCORE(zone, 'recherche') | retourne le score (degré de pertinence, compris entre 0 et 1) |
Ces deux fonctions peuvent avoir un troisième argument options, construit comme suit :
|
–Gestion des dates, des heures
On ne peut utiliser l'arithmétique temporelle qu'avec des dates, des heures, des horodatages
les calculs peuvent se faire sous la forme
date + durée = date
date - durée = date
date - date = durée
heure + durée = heure
etc ..
les durées peuvent être exprimées de manière explicite avec
YEARS | MONTHS | DAYS |
HOURS | MINUTES | SECONDS |
les durées résultat (DATLIV - DATCDE) seront toujours exprimées sous la forme AAAAMMJJ, où :
AAAA | represente le nombre d'années |
MM | le nombre de mois |
JJ | le nombre de jours |
Ainsi, si SQL affiche 812, il faut comprendre 8
mois, 12 jours
40301 signifie 4 ans , 03 mois, 01 jour (attention SQL risque d'afficher 40.301)
–Fonctions liées aux dates
Fonction(x) | Retourne ? | Exemple |
DATE(x) X doit être une chaîne au format SQL (ISO fonctionne toujours) |
une date (sur laquelle les fonctions suivantes s'appliquent) | DATE( |
DAY(D) DAYOFMONTH(D) |
retourne la partie jour de D (doit être une date ou un écart AAAAMMJJ). |
DAY(DATCDE) |
MONTH(D) | retourne la partie mois de D (idem) |
|
YEAR(D) | Retourne la partie année de D (idem) | YEAR(current date - DATCDE) |
DAYOFYEAR(D) | retourne le n° de jour dans l'année (julien) | DAYOFYEAR(datdep) |
DAYOFWEEK(D) | retourne le N° de jour dans la semaine (1 = Dimanche, 2=Lundi, ...) |
DAYOFWEEK(ENTRELE) |
DAYOFWEEK_ISO(D) | retourne le N° de jour dans la semaine (1 = Lundi, ...) |
DAYOFWEEK_ISO(ENTRELE) |
DAYNAME(d) | retourne le nom du jour de d (Lundi, Mardi, ...) | DAYNAME(datcde) |
MONTHNAME(d) | retourne le nom du mois de d (Janvier, Février, ...) | MONTHNAME(datcde) |
EXTRACT(day from d) | Extrait la partie jour de D (aussi MONTH et YEAR) | EXTRACT(MONTH from datcde) |
DAYS(D) | retourne le nbr de jours depuis 01/01/0001 | DAYS(datcde)- DAYS(datliv) |
QUARTER(D) | retourne le n° du trimestre | QUARTER(DATEFIN) |
WEEK(D) | retourne le n° de semaine (Attention 01/01/xx donne toujours semaine 1) |
WHERE |
WEEK_ISO(D) | retourne le n° de semaine (la semaine 1 est celle qui possède un JEUDI dans l'année.) |
WHERE |
CURDATE() | retourne la date en cours, comme CURRENT DATE | |
CURTIME() | retourne l'heure en cours, comme CURRENT TIME | |
NOW() | retourne le timestamp en cours | |
JULIAN_DAY(d) | retourne le nbr de jours qui sépare une date du 1er Janv. 4712 avant JC. | JULIAN_DAY(datcde) |
LAST_DAY(d) | retourne la date correspondant au dernier jour du mois. | LAST_DAY('2006-04-21') = 2006-04-30 |
ADD_MONTHS(d, nbr ) | ajoute un nbr de mois à une
date , si la date est au dernier jour du mois, la date calculée est aussi au dernier jour du mois |
ADD_MONTHS('2006-04-30' , 1) = 2006-05-31 |
NEXT_DAY(d, 'day' ) | retourne la prochaine date ayant le jour demandé | NEXT_DAY('2006-12-31' , 'DIM') |
MONTHS_BETWEEN(d, d) | retourne l'écart en mois (avec des décimales sur 31 jours) entre deux dates | months_between('25/09/08' , '31/08/08') |
–Fonctions liées aux heures
Fonction(x) | Retourne ? | Exemple |
TIME(T) | une heure | TIME( |
HOUR(T) |
retourne la partie heure de T | HOUR(Pointage) |
MINUTE(T) | retourne la partie minute de T |
|
SECOND(T) | Retourne la partie secondes de T | |
EXTRACT(hour from t) | la partie heure de T (aussi MINUTE et SECOND) | EXTRACT(SECOND from pointage) |
–Fonctions liées aux Timestamp
Fonction(x) | Retourne ? | Exemple | ||||||||||
TIMESTAMP(T) | un timestamp (date - heure - microsecondes) | TIMESTAMP(' |
||||||||||
TIMESTAMP (D T) |
un timestamp (microsecondes à 0) | TIMESTAMP(datcde heure) |
||||||||||
TIMESTAMP_ISO(x) |
un timestamp à partir de x Si x est une date, l'heure est à 00:00:00 Si x est une heure, la date est à aujourd'hui. |
TIMESTAMP_ISO(heure_pointage) |
||||||||||
TIMESTAMPDIFF (c 'DIFFERENCE') |
C indique l'unité de mesure de l'écart
que vous souhaitez obtenir
'DIFFERENCE' est la représentation caractères [ CHAR(22) ] d'un écart entre deux timestamp. |
TIMLESTAMPDIFF(32 , |
||||||||||
MIDNIGHT_SECONDS | retourne le nbr de secondes qui sépare un timestamp de minuit | MIDNIGHT_SECONDS(pointage) |
||||||||||
VARCHAR_FORMAT(d, 'YYYY-MM-DD HH24:MI:SS' ) | Transforme un timestamp en chaine (le format est imposé en V5R40, libre en V6) |
VARCHAR_FORMAT( now() , 'YYYY-MM-DD HH24:MI:SS') |
||||||||||
TIMESTAMP_FORMAT('c', f) | Transforme
une chaine c en
timestamp suivant le format f
|
TIMESTAMP_FORMAT('99/02/05' , 'RR/MM/DD') |
||||||||||
GENERATE_UNIQUE() | genère une valeur unique de type CHAR(13) basée sur le timestamp en cours. | insert GENERATE_UNIQUE() .... |
||||||||||
plus toutes les fonctions liées aux dates et aux heures |
|
– Sous sélections, Ordre SQL
intégré dans la clause WHERE (ou dans
la liste des colonnes) d'un ordre SQL :
SELECT * FROM tarif WHERE prix < (SELECT AVG(prix) from
tarif) |
SELECT * FROM tarif T WHERE prix
< |
donne la liste des articles ayant un prix inférieur à la moyenne de leur famille (sous sélection correllée)
Select codart , (qte * prix) as montant, (select sum(qte * prix) from commandes where famcod = c1.famcod) as global_famille |
donne la liste des commandes (article, montant commandé), en rappelant sur chaque ligne le montant global commandé dans la famille.
vous pouvez aussi utiliser la clause EXISTS dans un SELECT
imbriqué.
• Elle indique VRAI si le select imbriqué retourne
une ligne (ou plus)
• Elle indique FAUX si le select imbriqué ne retourne aucune
ligne.
Soit un fichier article ayant
une colonne STOCKAGE (O/N) et un fichier stock,
-> si vous voulez supprimer les articles dans le fichiers stock ayant la zone stockage à 'N' dans le fichier article.
DELETE from stock S where exists (SELECT * from articles where codart = S.codart and stockage = 'N') |
.
Copyright © 1995,2019 VOLUBIS