Conversion du numéro MySQL en chaîne. Conversion de type explicite. Limites de la conversion implicite

Lors de l'exécution d'un programme PL/SQL, il est souvent nécessaire de convertir des données d'un type à un autre. La conversion peut se faire de deux manières :

  • Implicitement- recherche " option optimale» confié au noyau d'exécution PL/SQL ;
  • Évidemment- la conversion est effectuée par un appel de fonction ou l'instruction PL/SQL correspondante.

Dans cette section, nous comprendrons d'abord comment les conversions implicites sont effectuées dans PL/SQL, puis nous explorerons les fonctions et opérateurs de conversion explicites.

Conversion de type implicite

Lorsque PL/SQL détecte un besoin de conversion, il tente de convertir la valeur dans le type correct. Vous pourriez être surpris de la fréquence à laquelle cela est fait. Sur la fig. La figure 1 montre les types de conversions de types implicites effectuées par PL/SQL.

Riz. 1

La conversion de type implicite se produit en spécifiant une valeur littérale dans une instruction ou une expression au format interne correct, que PL/SQL convertit selon les besoins. Dans l'exemple suivant, PL/SQL convertit la chaîne littérale « 125 » en valeur numérique 125 et l'affecte à une variable numérique :

DÉCLARE a_number NUMBER ; BEGIN a_number:= "125"; FIN;

La conversion de type implicite est également effectuée lors de la transmission de paramètres à un programme dans un format autre que celui qu'il utilise. DANS procédure suivante un tel paramètre est la date. Lorsque vous appelez cette procédure, vous lui transmettez une chaîne au format JJ-MMM-AA, qui est automatiquement convertie en date :

PROCÉDURE change_hiredate (emp_id_in IN INTEGER, Hiredate_in IN DATE) change_hiredate (1004, "12-DEC-94");

La conversion implicite de la chaîne en date est effectuée conformément aux spécifications NLS_DATE_FORMAT. Le problème est que s'il y a un changement NLS_DATE_FORMAT le programme sera perturbé.

Limites de la conversion implicite

Comme on peut le voir sur la Fig. 1, la conversion ne peut être effectuée qu'entre certains types de données ; PL/SQL ne peut pas convertir un type de données arbitraire en un autre. De plus, certaines conversions de types implicites génèrent des exceptions. Considérons l'opération d'affectation suivante :

DÉCLARE a_number NUMBER ; BEGIN a_number:= "abc"; FIN;

En PL/SQL, vous ne pouvez pas convertir la chaîne "abc" en nombre, donc l'exécution du code ci-dessus génère une exception VALUE_ERROR. C'est à vous de vous assurer que la valeur pour laquelle PL/SQL effectue une conversion de type peut être convertie sans erreur.

Inconvénients de la conversion implicite

La conversion de type implicite présente un certain nombre d'inconvénients.

  • PL/SQL est un langage typé statiquement. Les conversions implicites signifient la perte de certains des avantages du typage statique, tels que la clarté et la fiabilité du code.
  • Chaque conversion implicite signifie une perte partielle de contrôle sur le programme. Le programmeur ne l'exécute pas indépendamment et ne le contrôle d'aucune façon, mais suppose seulement qu'il sera exécuté et donnera effet désiré. Il existe ici un élément d'incertitude : si Oracle modifie la manière ou les conditions des conversions, le programme peut être affecté.
  • La conversion de type implicite en PL/SQL dépend du contexte. Cela peut fonctionner dans un programme et pas dans un autre, même si à première vue le code semble être le même. De plus, le résultat de la conversion de type ne correspond pas toujours aux attentes du programmeur.
  • Un programme est plus facile à lire et à comprendre si les données qu'il contient sont converties explicitement, car cela capture les différences entre les types de données dans différents tableaux ou dans une table et un code. Exclus du programme actions cachées, vous éliminez le risque d'erreurs.

Par conséquent, en SQL et PL/SQL, il est recommandé d’éviter la conversion de type implicite. Il est préférable d'utiliser des fonctions qui effectuent une conversion explicite - cela garantit que le résultat de la conversion correspondra exactement à vos attentes.

Conversion de type explicite

Oracle fournit un ensemble complet de fonctions et d'opérateurs qui peuvent être utilisés pour effectuer la conversion de types de données en SQL et PL/SQL. Leur liste complète est donné dans le tableau. 1. La plupart les fonctions sont décrites dans d'autres chapitres du livre (pour elles, le numéro de chapitre est indiqué dans la dernière colonne).

Tableau 1. Fonctions de conversion de type en PL/SQL

Fonction Conversion en cours
ASCIISTR Chaîne de n'importe quel jeu de caractères en chaîne ASCIIà partir du jeu de caractères de la base de données
CASTING Un type de données ou une valeur de collection intégré dans un autre type de données ou une collection intégré. Cette méthode peut être utilisée à la place des fonctions traditionnelles (telles que À CE JOUR)
ID CHARTOROW Chaîne en type valeur ROWID
CONVERTIR Une chaîne d'un jeu de caractères à un autre
FROM_TZ En type valeur HORODATAGE ajoute des informations sur le fuseau horaire, le convertissant ainsi en une valeur telle que HORODATAGE AVEC FUSEAU HORAIRE
HEXTORAW Valeur hexadécimale pour saisir la valeur BRUT
MULTIJEU Table de base de données à collectionner
NUMTODSINTERVAL INTERVALLE JOUR À SECONDE
NUMTOYMINTERVAL Numéro (ou expression numérique) en littéral INTERVALLE ANNÉE À MOIS
RAWTOHEX, RAWTONHEX Tapez la valeur BRUT au format hexadécimal
REFTOHEX Tapez la valeur RÉFà une chaîne de caractères contenant sa représentation hexadécimale
ROWIDTOCHAR, ROWIDTONCHAR Type de valeur binaire ROWIDà une chaîne de caractères
TABLEAU Collecte dans une table de base de données ; son action est inverse de la fonction MULTIJEU
LE Valeur de colonne dans la ligne de la table de base de données virtuelle
TO_BINARY_FLOAT Nombre ou chaîne dans BINARY_FLOAT
TO_BINARY_DOUBLE Nombre ou chaîne dans BINARY_DOUBLE
TO_CHAR, TO_NCHAR (version numérique) Nombre à chaîne ( VARCHAR2 ou NVARCHAR2 respectivement)
TO_CHAR, TO_NCHAR (version datée) Date à chaîner
TO_CHAR, TO_NCHAR (version caractères) Données du jeu de caractères de la base de données vers le jeu de caractères de la langue nationale
TO_BLOB Tapez la valeur BRUT V GOUTTE
TO_CLOB, TO_NCLOB Tapez la valeur VARCHAR2, NVARCHAR2 ou NCLOB V CLOB(ou NCLOB)
À CE JOUR Chaîne à ce jour
TO_DSINTERVAL Chaîne de caractères taper CHAR, VARCHAR2, NCHAR ou NVARCHAR2 en nature JOUR D'INTERVALLE À LA DEUXIÈME
TO_LOB Tapez la valeur LONG V LOB
TO_MULTI_BYTE Caractères à un octet de la chaîne source vers leurs équivalents multi-octets (si possible)
TO_NUMBER Une chaîne ou un nombre (par exemple, BINARY_FLOAT)V NOMBRE
TO_RAW Tapez la valeur GOUTTE V BRUT
TO_SINGLE_BYTE Caractères multi-octets de la chaîne d'origine en caractères codés correspondants
TO_TIMESTAMP HORODATAGE
TO_TIMESTAMP_TZ Chaîne de caractères vers le type valeur TO_TIMESTAMP_TZ
TO_YMINTERVAL Type de chaîne de caractères CHAR, VARCHAR2, NCHAR ou NVARCHAR2à une valeur de type INTERVALLE ANNÉE À MOIS
TRADUIRE... EN UTILISANT Texte en jeu de caractères spécifié pour convertir le jeu de caractères de la base de données en jeu de caractères national
UNISTR Une chaîne de n'importe quel jeu de caractères en Unicode

Fonction CHARTOROWID

Convertit une chaîne comme CARBONISER ou VARCHAR2à une valeur de type ROWID. Syntaxe de la fonction :

FONCTION CHARTOROWID (ligne source DANS CHAR) RETOUR ROWID FONCTION CHARTOROWID (ligne source DANS VARCHAR2) RETOUR ROWID

Pour réussir à convertir la fonction ID CHARTOROW la ligne doit être composée de 18 caractères au format :

OOOOOFFFFBBBBBBSSSSSS

où OOOOOO est le numéro de l'objet de données, FFF est le numéro relatif du fichier de base de données, BBBBBBB est le numéro de bloc dans le fichier et CCC est le numéro de ligne dans le bloc. Les quatre composants sont spécifiés au format Base64. Si la chaîne source n'est pas conforme à ce format, une exception est levée VALUE_ERROR .

Fonction CAST

Fonction CASTING est un mécanisme de conversion de données très pratique et flexible. Il convertit la valeur de n'importe quel (ou presque) type de données ou collection intégré en un autre type de données ou collection intégré, et sera probablement familier à tout programmeur ayant une expérience dans les langages orientés objet.

Utilisation de la fonction CASTING vous pouvez convertir une expression sans nom (nombre, date, NUL et même le résultat d'une sous-requête) ou d'une collection nommée (telle qu'une table imbriquée) en un type de données ou une collection nommée d'un type compatible. Les conversions valides entre les types de données intégrés sont présentées dans la Fig. 2. Les règles suivantes doivent être respectées :

  • la conversion du type de données n'est pas autorisée LONG, LONG CRU, tous types de données LOB et les types spécifiques à Oracle ;
  • désignation " DATE» le chiffre correspond aux types de données DATE, TIMESTAMP, TIMESTAMP AVEC FUSEAU HORAIRE, INTERVALLE JOUR À DEUXIÈME et INTERVALLE ANNÉE À MOIS;
  • Pour convertir une collection nommée d'un certain type en une collection nommée d'un autre type, les éléments des deux collections doivent avoir le même type ;

Riz. 2.

  • taper UROWIDE ne peut pas être converti en ROWID, Si UROWIDE contient la valeur ROWID tables d'index.

Ci-dessous un exemple d'utilisation de la fonction CASTING pour convertir les types de données scalaires. Son appel peut être inclus dans une commande SQL :

SELECT employé_id, cast (hire_date AS VARCHAR2 (30)) FROM employé ;

Il peut également être appelé en syntaxe PL/SQL :

DÉCLARE hd_display VARCHAR2(30); BEGIN hd_display:= CAST (SYSDATE AS VARCHAR2); FIN;

Application beaucoup plus intéressante CASTING rencontré lorsque vous travaillez avec des collections PL/SQL (tables imbriquées et VARRAY) car cette fonction permet de convertir une collection d'un type à un autre. En plus, CASTING peut être utilisé pour opérer (à partir d'instructions SQL) sur une collection déclarée comme variable PL/SQL.

Les deux sujets sont traités en détail au chapitre 12, et l'exemple suivant donne un aperçu de la syntaxe et des capacités de conversion. Nous créons d’abord deux types de tables imbriquées et une table relationnelle :

CREATE TYPE noms_t AS TABLE OF VARCHAR2 (100); CREATE TYPE author_t AS TABLE OF VARCHAR2 (100); CREATE TABLE favorite_authors (nom VARCHAR2(200))

/* Fichier sur le Web : cast.sql */ 1 DECLARE 2 scifi_favorites author_t 3:= author_t ("Sheri S. Tepper", "Orson Scott Card", "Gene Wolfe"); 4 BEGIN 5 DBMS_OUTPUT.put_line ("Je vous recommande de lire les livres par :"); 6 7 FOR rec IN (SELECT column_value favs 8 FROM TABLE (CAST (scifi_favorites AS names_t)) 9 UNION 10 SELECT NAME 11 FROM favorite_authors) 12 LOOP 13 DBMS_OUTPUT.put_line (rec.favs); 14 FIN DE BOUCLE ; 15 FIN ;

Les lignes 2 et 3 déclarent un tableau imbriqué local rempli des noms de plusieurs auteurs populaires. Sur les lignes 7 à 11 en utilisant l'opérateur UNION les lignes du tableau sont fusionnées auteurs_favoris Et scifi_favorites. Pour cela, une table imbriquée scifi_favorites(local et non visible par le moteur SQL) est converti à l'aide de la fonction CASTINGà une collection comme noms_t. Cette conversion est possible grâce à la compatibilité de leurs types de données. Après la conversion, appelez la commande TABLEAU indique au moteur SQL que la table imbriquée doit être interprétée comme relationnelle. Les résultats suivants s'affichent à l'écran :

Je vous recommande de lire les livres de : Gene Wolfe Orson Scott Card Robert Harris Sheri S. Tepper Tom Segev Toni Morrison

Fonction CONVERTIR

Convertit une chaîne d'un jeu de caractères en un autre. Syntaxe de la fonction :

FONCTION CONVERT (original_string IN VARCHAR2, new_charset VARCHAR2 [, old_charset VARCHAR2]) RETOUR VARCHAR2

Troisième argument vieux_character_set est facultatif. S'il n'est pas spécifié, le jeu de caractères par défaut de la base de données est utilisé.

Fonction CONVERTIR ne traduit pas de mots ou d'expressions d'une langue à une autre, mais remplace les lettres ou les symboles d'un jeu de caractères par des lettres ou des symboles d'un autre.

Les deux jeux de caractères les plus courants sont WE8MSWIN1252 (jeu de caractères 8 bits Caractères Microsoft Fenêtres page de codes 1252) et AL16UTF16 (jeu de caractères Unicode 16 bits).

Fonction HEXTORAW

Convertit une chaîne hexadécimale comme CARBONISER ou VARCHAR2à une valeur de type BRUT. Syntaxe de la fonction HEXTORAW :

FONCTION HEXTORAW (source_string IN CHAR) RETOUR RAW FONCTION HEXTORAW (source_string IN VARCHAR2) RETOUR RAW

Fonction RAWTOHEX

Convertit une valeur de type BRUTà une chaîne hexadécimale comme VARCHAR2. Syntaxe de la fonction RAWTOHEX :

FONCTION RAWTOHEX (valeur_binaire EN RAW) RETOUR VARCHAR2

Fonction RAWTOHEX renvoie toujours une chaîne longueur variable, bien que son inverse soit une fonction surchargée HEXTORAW prend en charge les deux types de chaînes.

Fonction ROWIDTOCHAR

Convertit un type de valeur binaire ROWIDà une chaîne comme VARCHAR2. Syntaxe de la fonction ROWIDTOCHAR :

FONCTION ROWIDTOCHAR (source_row IN ROWID) RETOUR VARCHAR2

La chaîne renvoyée par la fonction a le format suivant :

OOOOOFFFFBBBBBBSSSSSS

où OOOOOO est le numéro de l'objet de données, FFF est le numéro relatif du fichier de base de données, BBBBBB est le numéro de bloc dans le fichier et CCC est le numéro de ligne dans le bloc PL/SQL. Les quatre composants sont spécifiés au format Base64. Exemple:

AAARYiAAEAAAEG8AAB

Les implémentations du langage SQL peuvent effectuer une conversion de type implicite. Ainsi, par exemple, dans T-SQL lors de la comparaison ou de la combinaison de valeurs de types petit entier Et int, type de données petit entier sont implicitement convertis en type int. Détails sur la conversion de type explicite et implicite dans MS Serveur SQL peut être lu en BOL.

Exemple. Imprimez le prix moyen des bloc-notes PC avec le texte précédent "prix moyen = ".
Tentative de finalisation d'une demande


En conséquence, nous obtenons ce dont nous avions besoin :

donnera le résultat 1926. En principe, tout est correct, car En conséquence, nous avons obtenu ce que nous demandions : UN AN. Cependant, la moyenne arithmétique sera d'environ 1926,2381. Il convient de noter ici que fonctions d'agrégation(sauf pour la fonction COMPTER, qui renvoie toujours un entier) héritent du type de données des valeurs traitées. Puisque le champ lancé est un entier, nous avons obtenu la valeur moyenne avec les éléments rejetés partie fractionnaire(remarque – non arrondi).
Et si nous nous intéressons au résultat avec une précision donnée, disons, à deux décimales près ? Appliquer une expression CASTINGà la valeur moyenne ne donnera rien pour la raison évoquée ci-dessus. Vraiment,
Le résultat est 1926.238095. Ce n'est plus la même chose. La raison en est qu'une conversion de type implicite a été effectuée lors du calcul de la moyenne. Faisons un pas de plus :

Ceux. Nous avons utilisé une conversion implicite de l'argument entier en un type numérique exact (EXACT NUMERIC), en le multipliant par une unité réelle, puis avons appliqué une conversion explicite au type du résultat de la fonction d'agrégation.

Des conversions de type similaires peuvent être effectuées à l'aide de la fonction CONVERTIR:


Ici, nous convertissons la représentation sous forme de chaîne de date en type dateheure, après quoi nous exécutons conversion inverse pour afficher le résultat du formatage. L'argument style n'étant pas spécifié, la valeur par défaut (0 ou 100) est utilisée. En conséquence nous obtenons

Liste de toutes les valeurs d'argument possibles style peut être trouvé dans BOL.

Instruction CASE

Supposons que vous souhaitiez afficher une liste de tous les modèles de PC indiquant leurs prix. De plus, si le modèle n'est pas en vente (pas dans le tableau RS), alors à la place du prix, affichez le texte : « En rupture de stock ».
Une liste de tous les modèles de PC avec les prix peut être obtenue en utilisant la demande :

SÉLECTIONNEZ UN PRODUIT DISTINCT, un modèle, un prix À PARTIR DU produit, REJOIGNEZ À GAUCHE pc c
SUR produit.model=c.model
OÙ produit.type="pc";

Dans le jeu de résultats, le prix manquant sera remplacé par une valeur NULL :
modèle prix
1121 850
1232 350
1232 400
1232 600
1233 600
1233 950
1233 980
1260 350
2111 NUL
2112 NUL

Pour remplacer les valeurs NULL avec le texte requis, vous pouvez utiliser l'opérateur CAS:
Opérateur CAS en fonction des conditions spécifiées, renvoie l'une des nombreuses valeurs possibles. Dans notre exemple, la condition est de vérifier NULL. Si cette condition est remplie, alors le texte « En rupture de stock » est renvoyé, sinon ( AUTRE) renvoie la valeur du prix. Il y a ici un point fondamental. Depuis le résultat de l'opérateur SÉLECTIONNER est toujours une table, alors toutes les valeurs de n'importe quelle colonne doivent être du même type de données (sous réserve d'un transtypage de type implicite). Nous ne pouvons donc pas accepter le prix ( type numérique) génère une constante symbolique. C'est pourquoi une conversion de type est appliquée au champ prix pour convertir ses valeurs en représentation symbolique. En conséquence nous obtenons
modèle prix
1121 850
1232 350
1232 400
1232 600
1233 600
1233 950
1233 980
1260 350
2111 Pas disponible
2112 Pas disponible

Opérateur CAS peut être utilisé sous l’une des deux formes de notation syntaxique :

1ère forme
CAS<проверяемое выражение>
QUAND<сравниваемое выражение 1>
ALORS<возвращаемое значение 1>

QUAND<сравниваемое выражение N>
ALORS<возвращаемое значение N>
FIN

2ème forme
CAS
QUAND<предикат 1>
ALORS<возвращаемое значение 1>

QUAND<предикат N>
ALORS<возвращаемое значение N>
FIN

Toutes les offres QUAND doit avoir la même forme syntaxique, c'est-à-dire Vous ne pouvez pas mélanger la première et la deuxième forme. QUAND Lors de l'utilisation de la première forme syntaxique, la condition satisfait dès que la valeur expression en cours de test deviendra égal le sens de l'expression QUAND précisé dans l'offre QUAND. Lors de l'utilisation de la deuxième forme syntaxique, la condition satisfait dès que prédicat accepte valeur VRAI CAS. Si la condition est satisfaite, l'opérateur renvoie la valeur spécifiée dans la clause correspondante QUAND ALORS AUTRE. AUTRE Si aucune des conditions Si la condition est satisfaite, l'opérateur a échoué, la valeur spécifiée dans la clause sera utilisée
. CAS.
En l'absence , une valeur NULL sera renvoyée. Si plusieurs conditions sont remplies, la valeur de la phrase sera renvoyée le premier d'entre eux. CAS:

Dans l'exemple ci-dessus, la deuxième forme de l'opérateur a été utilisée

Notez que pour vérifier NULL, la norme propose une forme plus courte de l'opérateur - , une valeur NULL sera renvoyée. Si plusieurs conditions sont remplies, la valeur de la phrase sera renvoyée SE FONDRE

. Cet opérateur a un nombre arbitraire de paramètres et renvoie la première valeur non NULL. Pour deux paramètres, l'opérateur COALESCE(A, B) est équivalent à l'opérateur suivant CAS CAS OÙ A N'EST PAS NULL ALORS A ELSE B FIN La solution à l'exemple ci-dessus en utilisant l'opérateur peut être réécrit comme suit :

Utiliser la première forme syntaxique de l'opérateur
CAS prix QUAND (SELECT MAX(price) FROM pc) ALORS "Le plus cher"
QUAND (SELECT MIN(price) FROM pc) ALORS "Moins cher"
ELSE "Prix moyen" FIN commentaire
À PARTIR DE PC COMMANDER PAR prix ;

À la suite de l'exécution de la demande, nous obtenons

modèle prix commentaire
1232 350 Le moins cher
1260 350 Le moins cher
1232 400 Prix ​​moyen
1233 400 Prix ​​moyen
1233 600 Prix ​​moyen
1121 850 Prix ​​moyen
1233 950 Prix ​​moyen
1233 980 Le plus cher

Les implémentations du langage SQL peuvent effectuer une conversion de type implicite. Ainsi, par exemple, dans T-SQL lors de la comparaison ou de la combinaison de valeurs de types petit entier Et int, type de données petit entier sont implicitement convertis en type int. Vous pouvez en savoir plus sur la conversion de type explicite et implicite dans MS SQL Server en BOL.

Exemple. Affichez le prix moyen des bloc-notes PC avec le texte précédent « prix moyen = ».
Tentative de finalisation d'une demande

En conséquence, nous obtenons ce dont nous avions besoin :

Nous avons utilisé une expression de conversion de type explicite CASTING pour convertir la valeur du prix moyen en une représentation sous forme de chaîne. Syntaxe des expressions CASTING très simple :

CASTING(<выражение>COMME<тип данных>)

Il convient tout d'abord de garder à l'esprit que toutes les conversions de types ne sont pas possibles (la norme contient un tableau des conversions de types de données autorisées). Deuxièmement, le résultat de la fonction CASTING pour une valeur d'expression égale à NULL, elle sera également NULL.
Regardons-en un de plus exemple : déterminez l'année moyenne de mise à l'eau des navires à partir de la table Navires. Demande

SELECT AVG (lancé) FROM navires ;

donnera le résultat 1926. En principe, tout est correct, car En conséquence, nous avons obtenu ce que nous demandions : UN AN. Cependant, la moyenne arithmétique sera d'environ 1926,2381. Il convient de noter ici que les fonctions d'agrégation (à l'exception de la fonction COMPTER, qui renvoie toujours un entier) héritent du type de données des valeurs traitées. Puisque le champ lancé est un entier, nous avons obtenu la valeur moyenne en supprimant la partie fractionnaire (notez qu'elle n'a pas été arrondie).
Et si nous nous intéressons au résultat avec une précision donnée, disons, à deux décimales près ? Appliquer une expression CASTINGà la valeur moyenne ne donnera rien pour la raison évoquée ci-dessus. Vraiment,

Le résultat est 1926.238095. Ce n'est plus la même chose. La raison en est qu'une conversion de type implicite a été effectuée lors du calcul de la moyenne. Faisons un pas de plus :

Ceux. Nous avons utilisé une conversion implicite de l'argument entier en un type numérique exact (EXACT NUMERIC), en le multipliant par une unité réelle, puis avons appliqué une conversion explicite au type du résultat de la fonction d'agrégation.

Des conversions de type similaires peuvent être effectuées à l'aide de la fonction CONVERTIR:

Ici, nous convertissons la représentation sous forme de chaîne de date en type dateheure, puis effectuez la conversion inverse pour démontrer le résultat du formatage. L'argument style n'étant pas spécifié, la valeur par défaut (0 ou 100) est utilisée. En conséquence nous obtenons

Vous trouverez ci-dessous quelques autres valeurs d'argument style et le résultat obtenu à partir de l'exemple ci-dessus. Notez que les valeurs style des centaines plus grandes donnent lieu à un affichage de l'année à quatre chiffres.

Liste de toutes les valeurs d'argument possibles style peut être trouvé dans BOL.

Supposons que vous souhaitiez afficher une liste de tous les modèles de PC indiquant leurs prix. De plus, si le modèle n'est pas en vente (pas dans le tableau RS), alors à la place du prix, affichez le texte : « En rupture de stock ».
Une liste de tous les modèles de PC avec les prix peut être obtenue en utilisant la demande :

Pour remplacer les valeurs NULL par le texte souhaité, vous pouvez utiliser l'opérateur CAS:

Opérateur CAS En fonction des conditions spécifiées, renvoie l'une des nombreuses valeurs possibles. Dans notre exemple, la condition est de vérifier NULL. Si cette condition est remplie, alors le texte « En rupture de stock » est renvoyé, sinon ( AUTRE) renvoie la valeur du prix. Il y a ici un point fondamental. Depuis le résultat de l'opérateur SÉLECTIONNER est toujours une table, alors toutes les valeurs de n'importe quelle colonne doivent être du même type de données (sous réserve d'un transtypage de type implicite). Par conséquent, nous ne pouvons pas afficher une constante symbolique avec le prix (type numérique). C'est pourquoi une conversion de type est appliquée au champ prix pour convertir ses valeurs en représentation symbolique. En conséquence nous obtenons

Opérateur CAS peut être utilisé sous l’une des deux formes de notation syntaxique :

1ère forme
CAS<проверяемое выражение>
QUAND<сравниваемое выражение 1>
ALORS<возвращаемое значение 1>

QUAND<сравниваемое выражение N>
ALORS<возвращаемое значение N>
FIN

2ème forme
CAS
QUAND<предикат 1>
ALORS<возвращаемое значение 1>

QUAND<предикат N>
ALORS<возвращаемое значение N>
FIN

Toutes les offres QUAND doit avoir la même forme syntaxique, c'est-à-dire Vous ne pouvez pas mélanger la première et la deuxième forme. Lors de l'utilisation de la première forme syntaxique, la condition QUAND satisfait dès que la valeur satisfait dès que la valeur deviendra égal à la valeur de l'expression spécifiée dans la phrase QUAND précisé dans l'offre QUAND satisfait dès que satisfait dès que est évalué à VRAI. Si la condition est satisfaite, l'opérateur CAS. Si la condition est satisfaite, l'opérateur. Si aucune des conditions QUAND ALORS AUTRE. En l'absence AUTRE, une valeur NULL sera renvoyée. Si plusieurs conditions sont remplies, la valeur de la phrase sera renvoyée Si la condition est satisfaite, l'opérateur le premier d'entre eux.
. CAS.
Notez que pour vérifier NULL, la norme propose une forme plus courte de l'opérateur - , une valeur NULL sera renvoyée. Si plusieurs conditions sont remplies, la valeur de la phrase sera renvoyée. Cet opérateur a un nombre arbitraire de paramètres et renvoie la première valeur non NULL. Pour deux paramètres, l'opérateur COALESCE(A, B) est équivalent à l'opérateur suivant CAS:

Dans l'exemple ci-dessus, la deuxième forme de l'opérateur a été utilisée

Notez que pour vérifier NULL, la norme propose une forme plus courte de l'opérateur - , une valeur NULL sera renvoyée. Si plusieurs conditions sont remplies, la valeur de la phrase sera renvoyée peut être réécrit comme suit :

. Cet opérateur a un nombre arbitraire de paramètres et renvoie la première valeur non NULL. Pour deux paramètres, l'opérateur COALESCE(A, B) est équivalent à l'opérateur suivant CAS peut être démontré dans ce qui suit La solution à l'exemple ci-dessus en utilisant l'opérateur : Afficher tous les modèles de PC disponibles avec les prix. Marquez les modèles les plus chers et les moins chers.

SÉLECTIONNEZ LE modèle DISTINCT, le prix,
CAS prix QUAND (SELECT MAX(price) FROM pc) ALORS ‘Le plus cher’
QUAND (SELECT MIN(price) FROM pc) ALORS « Moins cher »
ELSE « Prix moyen » FIN commentaire
À PARTIR DE PC COMMANDER PAR prix ;

À la suite de l'exécution de la demande, nous obtenons

modèle prix commentaire
1232 350 Le moins cher
1260 350 Le moins cher
1232 400 Prix ​​moyen
1233 400 Prix ​​moyen
1233 600 Prix ​​moyen
1121 850 Prix ​​moyen
1233 950 Prix ​​moyen
1233 980 Le plus cher

chemisiers et chemises du fabricant
niko-opt.com
Électrocardiographe ext 12-03 alta acheter cardiomc.com.ua
cardiomc.com.ua
Fabrication de cabines
Catalogue de produits, caractéristiques techniques. Catalogue de produits.
module-house.ru

Conversion de données

Dernière mise à jour : 29/07/2017

Lorsque nous attribuons une valeur d'un type à une colonne qui stocke des données d'un autre type ou effectuons des opérations impliquant des données de types différents, SQL Server tente d'effectuer une conversion et de convertir la valeur utilisée pour le bon type. Mais toutes les conversions ne peuvent pas être effectuées automatiquement par SQL Server. SQL Server peut effectuer des conversions implicites d'un type de priorité inférieure vers un type de priorité supérieure. Tableau des priorités (plus la priorité est élevée) :

dateheure
petite dateheure
flotter
réel
décimal
argent
petit argent
int
petit entier
minusculeint
peu
nvarchar
nchar
Varchar
carboniser

Autrement dit, SQL Server peut automatiquement convertir le nombre 100,0 (float) en date et heure (datetime).

Dans les cas où il est nécessaire d'effectuer des conversions de types avec une priorité plus élevée vers des types avec une priorité plus faible, il est alors nécessaire d'effectuer casting explicite genres. Pour ce faire, T-SQL définit deux fonctions : CONVERT et CAST.

La fonction CAST convertit une expression d'un type en un autre. Il a la forme suivante :

CAST(expression AS type_données)

Pour prenons un exemple les tableaux suivants :

CREATE TABLE Products (Id INT IDENTITY PRIMARY KEY, ProductName NVARCHAR(30) NOT NULL, Manufacturer NVARCHAR(20) NOT NULL, ProductCount INT DEFAULT 0, Price MONEY NOT NULL); CREATE TABLE Clients (Id INT IDENTITY PRIMARY KEY, FirstName NVARCHAR(30) NOT NULL) ; CREATE TABLE Orders (Id INT IDENTITY PRIMARY KEY, ProductId INT NOT NULL REFERENCES Products(Id) ON DELETE CASCADE, CustomerId INT NOT NULL REFERENCES Customers(Id) ON DELETE CASCADE, CreatedAt DATE NOT NULL, ProductCount INT DEFAULT 1, Price MONEY NOT NULL );

Par exemple, lors de l'affichage d'informations sur les commandes, convertit une valeur numérique et une date en chaîne :

SELECT Id, CAST (CreatedAt AS nvarchar) + '; total : ' + CAST (Prix * ProductCount AS nvarchar) FROM Commandes

Convertir

La plupart des transformations sont couvertes par la fonction CAST.

Fonctions CAST et CONVERT (Transact-SQL)

Si une sorte de formatage supplémentaire, vous pouvez alors utiliser la fonction CONVERT. Il a la forme suivante :

CONVERTIR(type_données, expression [, style])

Troisième paramètre facultatif spécifie le style de formatage des données. Ce paramètre représente une valeur numérique qui a différentes interprétations pour différents types de données. Par exemple, quelques valeurs pour le formatage des dates et des heures :

    ou - format de date "Lun jj aaaa hh:miAM/PM" (valeur par défaut)

    ou - format de date "mm/jj/aaaa"

    ou - format de date « jj/mm/aaaa »

    ou - format de date "Lun jj, aaaa hh:miAM/PM"

    ou - format de date "hh:mi:ss"

    ou - format de date "jj-mm-aaaa"

    ou - format de date « hh:mi:ss:mmmm » (format heure 24 heures)

Quelques valeurs pour formater les données monétaires en chaîne :

    — il ne reste que deux chiffres dans la partie fractionnaire du nombre (par défaut)

    - il ne reste que deux chiffres dans la partie fractionnaire du nombre, et une virgule est utilisée pour séparer les chiffres

    - il ne reste que quatre chiffres dans la partie fractionnaire du nombre

Par exemple, affichons la date et le coût des commandes avec mise en forme :

SELECT CONVERT(nvarchar, CreatedAt, 3), CONVERT(nvarchar, Price * ProductCount, 1) FROM Orders

TRY_CONVERT

Lors de l'utilisation des fonctions CAST et CONVERT, SQL Server lève une exception si les données ne peuvent pas être converties en un certain type. Par exemple:

SELECT CONVERTIR(int, 'sql')

Pour éviter de lever une exception, vous pouvez utiliser la fonction TRY_CONVERT. Son utilisation est similaire Fonctions CONVERTIRà l'exception que si l'expression ne peut pas être convertie dans le type souhaité, alors la fonction renvoie NULL :

SELECT TRY_CONVERT(int, 'sql') - NULL SELECT TRY_CONVERT(int, '22') - 22

Fonctionnalités supplémentaires

Outre CAST, CONVERT, TRY_CONVERT, il existe un certain nombre de fonctions qui peuvent être utilisées pour convertir en plusieurs types :

    STR(float [, length [,decimal]]) : convertit un nombre en chaîne. Le deuxième paramètre indique la longueur de la ligne et le troisième - combien de chiffres doivent rester dans la partie fractionnaire du nombre

    CHAR(int) : convertit un code numérique ASCII en caractère. Souvent utilisé dans les situations où un caractère est nécessaire et ne peut pas être saisi à partir du clavier.

    ASCII(char) : convertit un caractère en code numérique ASCII

    NCHAR(int) : convertit un code numérique UNICODE en caractère

    UNICODE(char) : convertit un caractère en code numérique UNICODE

SELECT STR(123.4567, 6,2) — 123.46 SELECT CHAR(219) — ou SELECT ASCII('ы') — 219 SELECT NCHAR(1067) — ou SELECT UNICODE('ы') — 1067

Référence SQL

Conversion de types

L'ensemble des types autorisés pour la conversion en constructions CAST AS est déterminé par l'implémentation du SGBD. Donc dans MySQL, il ne peut que convertir types suivants: binaire[(n)], char[(n)], date, datetime, decimal[(m[,d])], signé, heure, unsigned. Et dans Oracle, en plus de convertir les types intégrés, vous pouvez convertir des sélections contenant de nombreux enregistrements en tableaux.

PostgreSQL possède des capacités de conversion plus avancées. Tout d’abord, vous pouvez ajouter votre propre conversion pour les types intégrés et personnalisés. Deuxièmement, il existe son propre opérateur de conversion de type plus pratique ::.

Dans la plupart des cas, une conversion vers ou depuis une chaîne est nécessaire.

Opérateurs arithmétiques SQL de base

Dans ce cas, les SGBD fournissent des fonctions supplémentaires.

Fonctions Oracle

  • to_char(date [,format[,nlsparams]]) - date en chaîne ;
  • to_char(number [,format[,nlsparams]]) - nombre en chaîne ;
  • à ce jour(string[,format[,nlsparams]]) - chaîne à ce jour ;
  • numéro_à(string [ ,format[, nlsparams] ]) - chaîne en nombre ;
  • vers_horodatage(chaîne, format) — chaîne à l'heure.

Dans ces fonctions de formatage une description du format de date ou de nombre, et nlsparams sont des paramètres nationaux. Le format de chaîne de date est défini les éléments suivants:

  • "" — insère le texte spécifié entre guillemets ;
  • Après J.-C., après J.-C.— insère AD avec ou sans points ;
  • VS, Colombie-Britannique— insère des avions avec ou sans points ;
  • SS, SCC— insère un siècle, SCC renvoie les dates solaires sous forme de nombres négatifs ;
  • D— insère le jour de la semaine ;
  • JOUR— insère le nom du jour, complété par des espaces jusqu'à une longueur de neuf caractères ;
  • DD— insère le jour du mois ;
  • DDD— insère le jour de l'année;
  • DY1— insère le nom abrégé du jour;
  • FF2— insère des fractions de secondes quel que soit le système numérique ;
  • NN, NN12— insère l'heure du jour (de 1 à 12) ;
  • NN24— insère l'heure du jour (de 0 à 23) ;
  • MI— insère des minutes ;
  • MM— insère le numéro du mois ;
  • MAMAN— insère le nom abrégé du mois;
  • MOISn— insère le nom du mois, complété par des espaces allant jusqu'à neuf caractères ;
  • R.M.— insère le mois en chiffres romains ;
  • R.R.— insère les deux derniers chiffres de l'année;
  • €€€€— insère toute l'année;
  • SS— insère les secondes ;
  • SSSS— insère le nombre de secondes depuis minuit ;
  • WW— insère le numéro de semaine de l'année (la semaine est de 7 jours à partir du premier jour, et non du lundi au dimanche) ;
  • W— insère le numéro de semaine du mois ;
  • Y.AAAA— insère l'année avec une virgule à la position spécifiée ;
  • ANNÉE, ANNÉE— insère l'année, SYEAR renvoie les dates du soleil sous forme de nombres négatifs ;
  • AAAA, SAAAA— insère une année à quatre chiffres, SYYYY renvoie les dates du soleil sous forme de nombres négatifs ;
  • AAAA, AA, O— insère le numéro correspondant des derniers chiffres de l'année.

Format droite numérique est précisé par les éléments suivants :

  • $ — insère un signe dollar devant le numéro ;
  • DANS— insère des espaces pour la partie entière d'un nombre décimal si elle est égale à zéro ;
  • MI— insère un signe moins à la fin (par exemple, "999.999mi");
  • S— insère un signe dièse au début ou à la fin (par exemple, "s9999" ou "9999s") ;
  • RP- écrit nombre négatif entre crochets (par exemple, "999.999pr");
  • D— insère un séparateur décimal à la position spécifiée (par exemple, "999D999") ;
  • G— insère un séparateur de groupe à la position spécifiée (par exemple, "9G999G999"). En même temps partie fractionnaire les numéros sont rejetés ;
  • AVEC— insère un identifiant de devise ISO au début ou à la fin d'un nombre (par exemple, "c9999" ou "9999c") ;
  • L— insère un symbole monétaire local au début ou à la fin d'un nombre (par exemple, "l9999" ou "9999l");
  • , — insère une virgule à la position spécifiée, quel que soit le séparateur de groupe ;
  • . — insère un point décimal à la position spécifiée, quel que soit le séparateur décimal ;
  • V— renvoie la valeur multipliée par 10^n, où n est égal au nombre de neuf après V. Cette valeur est arrondie si nécessaire ;
  • EEEE— 9,99EEEE renvoie une valeur en notation exponentielle ;
  • R.M.— La valeur RM sera écrite en chiffres romains en majuscules ;
  • rm— la valeur rm sera écrite en chiffres romains minuscules ;
  • 0 — insère des zéros au lieu d'espaces au début ou à la fin d'une ligne, par exemple, 9990 insère des zéros au lieu d'espaces à la fin d'une ligne ;
  • 9 — chaque 9 définit un chiffre significatif.

Fonctions PostgreSQL

  • to_char(horodatage, format) - heure dans une chaîne ;
  • to_char(intervalle, format) — intervalle de temps par ligne ;
  • to_char(nombre, format) - nombre en chaîne ;
  • à ce jour(str, format) - chaîne à ce jour ;
  • numéro_à(str, format) - chaîne en nombre ;
  • vers_horodatage(str, format) - chaîne à l'heure.

Les éléments de formatage de base sont les mêmes que ceux d'Oracle.

Fonctions MySQL

  • date_format(date,format) - date en chaîne ;
  • format_heure(heure, format) - heure dans une chaîne ;
  • format(number,precision) — nombre dans une chaîne comme "#,###,###.##", où le nombre de caractères est déterminé par le deuxième argument.

Vous trouverez ci-dessous une liste d'éléments de formatage de base pour la date et l'heure :

  • %c- mois par date ;
  • %d- jour du mois ;
  • %H— heures (de 0 à 24) ;
  • %h— heures (1 à 12);
  • %je- minutes;
  • %s— secondes ;
  • %T— l'heure au format « hh:mm:ss » ;
  • %Y— année, quatre chiffres ;
  • %y- année, deux chiffres.

Opérateurs SQL de base.

SQL (Structured Query Language - « langage de requête structuré ») - universel langage informatique, utilisé pour créer, modifier et gérer des données dans des bases de données relationnelles. Le langage SQL est basé sur l'algèbre relationnelle et est un ensemble d'opérateurs.

Il existe 4 groupes d'opérateurs. Considérons un groupe d'opérateurs de manipulation de données (Data Manipulation Language, DML, SQLLMD)

Sélection des données

La sélection des données est l'opération la plus courante effectuée avec en utilisant SQL. L'instruction SELECT est l'une des instructions les plus importantes de ce langage, utilisée pour sélectionner des données. La syntaxe de cet opérateur est la suivante :

SELECT colonne FROM table

Les instructions SELECT doivent contenir les mots SELECT et FROM ; autre mots-clés sont facultatifs.

Le mot-clé SELECT est suivi d'informations sur les champs à inclure dans l'ensemble de données résultant. Un astérisque (*) désigne tous les champs du tableau, par exemple :

Pour sélectionner une colonne, utilisez la syntaxe suivante :

Société SÉLECTIONNÉE

Un exemple de sélection de plusieurs colonnes ressemble à ceci :

SELECT Entreprise, Téléphone, Mail

Pour spécifier les noms des tables dans lesquelles les enregistrements sont sélectionnés, utilisez le mot clé FROM, par exemple :

SELECT * FROM Clients

Cette requête renverra tous les champs de la table Clients.

Pour filtrer les résultats renvoyés Instruction SELECT, vous pouvez utiliser une clause WHERE (facultatif)

SELECT * FROM Produits WHERE Catégorie = 4

Vous pouvez utiliser diverses expressions dans la clause WHERE,

OÙ expression1 [(ET | OU) expression2 ...]

Par exemple:

SELECT * FROM Produits OÙ Catégorie = 2 ET Postavshik > 10

SELECT Nom, Prix FROM Produits OÙ Catégorie = 3 OU Prix< 50

Vous pouvez utiliser les opérateurs suivants :

< Меньше

<= Меньше или равно

<>Pas égal

> Plus

>= Supérieur ou égal à

La clause ORDER BY (facultative) est utilisée pour trier l'ensemble de données résultant sur une ou plusieurs colonnes.

Fonction CAST de SQL Server

Les mots-clés ASC (croissant) ou DESC (décroissant) sont utilisés pour déterminer l'ordre de tri. Par défaut, les données sont triées par ordre croissant.

Modification des données

En plus de l'extraction de données Langage SQL peut être utilisé pour mettre à jour et supprimer des données, copier des enregistrements vers d'autres tables et effectuer d'autres opérations. Ci-dessous, nous examinerons les instructions UPDATE, DELETE et INSERT utilisées pour résoudre certains de ces problèmes.

Instruction MISE À JOUR

Pour modifier les valeurs dans une ou plusieurs colonnes du tableau, utilisez Instruction MISE À JOUR. La syntaxe de cet opérateur est :

UPDATE table SET colonne1 = expression1 WHERE critères

L'expression dans la clause SET peut être une constante ou le résultat d'un calcul. Par exemple, pour augmenter les prix de tous les produits coûtant moins de 10 $, vous pouvez exécuter la requête suivante :

UPDATE Produits SET Prix = Prix * 1.1 OÙ Prix< 10

Instruction DELETE

Pour supprimer des lignes des tableaux, vous devez utiliser l'opérateur DELETE dont la syntaxe est :

DELETE FROM table WHERE critères

Supprimez tous les produits dont le coût est inférieur à 100 :

SUPPRIMER DES Produits OÙ Prix< 100

Instruction INSÉRER

Pour ajouter des enregistrements aux tables, vous devez utiliser l'instruction INSERT dont la syntaxe est :

INSÉRER DANS la table ( VALEURS (expression [, ...])

Par exemple, vous pouvez utiliser la requête suivante pour ajouter un nouveau client à la table Clients.



Des questions ?

Signaler une faute de frappe

Texte qui sera envoyé à nos rédacteurs :