[Résolu] SQL: INSERT avec une condition

Discussions sur le module de base de données Base et plus particulièrement sur le langage SQL ou sur les connexions aux SGBD tiers.
Les questions sur les macros doivent être postées dans la section dédiée en dessous.

Modérateur: Vilains modOOs

Règles du forum
Cette section est dédiée au module Base et plus particulièrement sur le langage SQL ou sur les connexions aux SGBD tiers. Vous ne devez pas poster ici de questions sur les macros mais utiliser la section éponyme.
Pour accélérer les réponses, vous pouvez mettre en ligne votre base en joignant un fichier ODB : comment faire.

[Résolu] SQL: INSERT avec une condition

Messagepar Tiogran » 11 Déc 2019 09:40

Bonjour,

Je recherche une instruction SQL permettant d'insérer un nouvel élément dans une table mais sous une condition précise.
En langage courant, je voudrais demander "Inseres dans la table ELEMENTS en renseignant le champs LIBELLE avec la valeur "Exemple" si aucun ELEMENT a pour son champs ACTIF la valeur NULL"
Naivement, j'ai pensé donc à l'instruction SQL suivante:
Code : Tout sélectionner   AgrandirRéduire
INSERT INTO ELEMENTS (LIBELLE) VALUES (Exemple) WHERE EXISTS (SELECT * FROM ELEMENTS WHERE ACTIF IS NULL)


Rassurez-vous, je comprends bien l'hérésie d'une telle instruction mais je me suis dit qu'EXISTS ferait office de test et je voulais montrer également que j'avais tenté quelque chose quand même avant de déranger les bénévoles.

Merci d'avance à ceux qui voudront bien m'enseigner la solution.

Tiogran
Dernière édition par Tiogran le 23 Déc 2019 17:31, édité 1 fois.
Libre Office 6.3.4.2
Linux Mint et Windows 7,8 et 10
Tiogran
Membre lOOyal
Membre lOOyal
 
Message(s) : 27
Inscrit le : 16 Nov 2016 19:31

Re: SQL: INSERT avec une condition

Messagepar micmac » 11 Déc 2019 10:08

Bonjour,
Dans votre signature il y a écrit: Libre Office 5.2.7.2
Linux Mint et Windows 7,8 et 10
Votre signature fait mention d'une version de LibreOffice qui n'est plus maintenue.
Est-ce une erreur, un oubli, un choix, une obligation ?
Dans ce dernier cas, mentionnez-le dans votre signature par Obligation de version.

Afin de profiter des dernières améliorations, il est fortement recommandé d'être à jour de la dernière version stable

Accès direct à votre signature pour la corriger.

Cordialement.
Les formats ouverts (ODF) assurent la pérennité de vos documents.
Avatar de l’utilisateur
micmac
RespOOnsable forum
RespOOnsable forum
 
Message(s) : 6499
Inscrit le : 28 Août 2010 09:45

Re: SQL: INSERT avec une condition

Messagepar jeanmimi » 11 Déc 2019 10:41

Bonjour,
Les commandes SQL sont décrites ici :
https://wiki.openoffice.org/wiki/FR/Doc ... h09#INSERT
et il y a plusieurs exemples dans le forum.
LibreOffice Version : Version: 6.4.0.3 (x64) (1 février 2020)
AdoptOpenJDK (x64) 1.8.0_xxx, Windows 10, Thunderbird, Firefox
Avatar de l’utilisateur
jeanmimi
Grand Maître de l'OOffice
Grand Maître de l'OOffice
 
Message(s) : 15172
Inscrit le : 03 Mars 2006 17:02
Localisation : Venise verte

Re: SQL: INSERT avec une condition

Messagepar Tiogran » 11 Déc 2019 11:14

micmac a écrit:Votre signature fait mention d'une version de LibreOffice qui n'est plus maintenue.
Est-ce une erreur, un oubli, un choix, une obligation ?
Dans ce dernier cas, mentionnez-le dans votre signature par Obligation de version.


C'est fait, merci pour le lien vers le profil.
Mes excuses pour le dérangement

jeanmimi a écrit:Bonjour,
Les commandes SQL sont décrites ici :
https://wiki.openoffice.org/wiki/FR/Doc ... h09#INSERT
et il y a plusieurs exemples dans le forum.

Merci du lien, je l'étudie et maintient le post en conséquence

Edit 12/12/2019: Sur la documentation liée, INSERT INTO est décrite comme une instruction insérant donc un nouvel enregistrement en fournissant des valeurs fournies directement avec VALUES ou autrement par une autre requête avec un SELECT. Bref, tout celà est bien laconique et ne m'aide pas puisque je ne cherche pas des variantes permettant de fournir des valeur lors d'une insertion mais plutôt sur la base d'un test effectuer un traitement.

J'ai donc cherché ailleurs comme ici:https://docs.microsoft.com/fr-fr/sql/t-sql/language-elements/if-else-transact-sql?view=sql-server-ver15
Là je retrouve une structure connue qui effectuerai bien ce que je désire.
Directement sur dBase, je tente un test juste pour vérifier la syntaxe. Mais le module dBase me renvoit "3: Unexpected token: IF in statement [IF]"
Code : Tout sélectionner   AgrandirRéduire
IF COUNT(SELECT * FROM "ELEMENTS") > 0
SELECT * FROM "ELEMENTS"

Sur le lien fourni juste avant, une note précise "Une construction IF...ELSE peut être utilisée dans des traitements d'instructions, des procédures stockées et des requêtes ad hoc". Aie alors là, je suis en terrain inconnu, il fait noir, je vérifier que ma lampe est allumée... :lol: mais bon je ne vais pas me décourager mais je commence à me dire qu'à vouloir économiser une requête peut être traiter ce test en Basic çà sera plus simple néanmoins je trouve celà intéressant et je vais poursuivre mais pas de suite...
Libre Office 6.3.4.2
Linux Mint et Windows 7,8 et 10
Tiogran
Membre lOOyal
Membre lOOyal
 
Message(s) : 27
Inscrit le : 16 Nov 2016 19:31

Re: SQL: INSERT avec une condition

Messagepar jeanmimi » 12 Déc 2019 12:02

Dans le tutoriel page 5, l'instruction SQL pour INSERT est décrite avec une exemple :
L’instruction INSERT
Cette instruction (qui fait partie du DML – Data Manipulation Language, Langage de Manipulation des Données) permet d'ajouter un enregistrement dans la table spécifiée. Elle se présente sous la forme :
Code : Tout sélectionner   AgrandirRéduire
INSERT INTO <table> (<NomDeChamp1> [, <NomDeChamp2>, ...] ) VALUES ( <Valeur1> [, [ <Valeur2>, ... ])

Les premières parenthèses contiennent la liste des champs affectés. Les secondes parenthèses contiennent les valeurs qui seront affectées à ces champs, dans le même ordre. On n'est pas obligé de remplir tous les champs de la table ; seuls les champs définis comme NOT NULL doivent être remplis..
Exemple :
Code : Tout sélectionner   AgrandirRéduire
INSERT INTO "Clients" ("ID", "Nom", "Prenom", "Avoir" ) VALUES ( 12, 'Dupont', 'Pierre', 152.50)

L'instruction est reprise dans le code d'une Macro.
Bonne lecture !
Pièces jointes
Tutoriel Langage SQL.odt
(29.21 Kio) Téléchargé 6 fois
LibreOffice Version : Version: 6.4.0.3 (x64) (1 février 2020)
AdoptOpenJDK (x64) 1.8.0_xxx, Windows 10, Thunderbird, Firefox
Avatar de l’utilisateur
jeanmimi
Grand Maître de l'OOffice
Grand Maître de l'OOffice
 
Message(s) : 15172
Inscrit le : 03 Mars 2006 17:02
Localisation : Venise verte

Re: SQL: INSERT avec une condition

Messagepar Tiogran » 12 Déc 2019 13:59

Bonjour jeanmimi, merci de prendre sur ton temps pour me répondre. Je m'apercois qu'il y a malentendu sur ma question.
Je ne cherche pas à faire une instruction INSERT classique mais à l'executer seulement consécutivement à un test . Pour l'illustrer je vais créer un exemple physique d'une table ELEMENTS et pour te montrer que je sais faire une instruction INSERT, insérer un nouvel élément avec une valeur pour un champs et pas dans l'autre.
Voici un TABLE ELEMENTS
elements.jpg
elements.jpg (8.77 Kio) Consulté 136 fois

supposons une instruction INSERT classique qui, preuve en image, fonctionne
insert classique.jpg


Jusqu'ici tout va bien.

Maintenant je veux pouvoir effectuer cette instruction INSERT mais seulement si dans ELEMENTS, aucun enregistrement n'a son champs ELEMENT_ACTIF avec pour valeur Null. On peut tester cette condition avec cette requête par exemple

Code : Tout sélectionner   AgrandirRéduire
SELECT * FROM "ELEMENTS" WHERE "ELEMENT_ACTIF" IS NULL


(Reformulation) Ici si un seul enregistrement a ELEMENT_ACTIF avec une valeur NULL, il ressortira et DONC je ne ferai pas l'instruction d'INSERT précédente.

Pour obtenir ce traitement, soit je le fais en programmation en isolant le résultat de la requete SELECT et suivant ce résultat, j'execute ou non la requête d'INSERT soit je trouve une instruction SQL qui me le permet et c'est ce que je souhaite trouver dans ce post si cela est bien evidemment possible.

Tiogran

PS: un fichier odb pour jeu de test

Edit 14/12: Je viens d'avoir la confirmation sur un autre forum, il faut faire du pl/sql. je me penche dessus
Edit 20/12: Sur wikipedia, le PL/SQL est définit comme un langage propriétaire de Oracle. Aie bon dommage, on va faire sans et donc celà ne sera possible qu'avec un traitement basic ou autre
Pièces jointes
insert.odb
(4.25 Kio) Téléchargé 8 fois
Libre Office 6.3.4.2
Linux Mint et Windows 7,8 et 10
Tiogran
Membre lOOyal
Membre lOOyal
 
Message(s) : 27
Inscrit le : 16 Nov 2016 19:31


Retour vers Base de données

Qui est en ligne ?

Utilisateur(s) parcourant ce forum : Aucun utilisateur inscrit et 2 invité(s)