IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage SQL Discussion :

Lancer une requête depuis psql (bash linux) en échappant des caractères, effacer conditionnellement du contenu


Sujet :

Langage SQL

  1. #1
    Membre à l'essai
    Homme Profil pro
    Architecte sys d'info géographique
    Inscrit en
    Juin 2011
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Architecte sys d'info géographique
    Secteur : Transports

    Informations forums :
    Inscription : Juin 2011
    Messages : 49
    Points : 19
    Points
    19
    Par défaut Lancer une requête depuis psql (bash linux) en échappant des caractères, effacer conditionnellement du contenu
    Bonjour, je souhaite remplacer les valeurs de colonne si la valeur de la colonne est égale à une certaine valeur.

    en effet dans certaines tables, le nom de la valeur est égal à peu près au titre de la colonne, je voudrais remplacer ça par NULL (rien).

    Directement dans psql j'ai semble t-il eu un succès avec ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    UPDATE "test.poi.barrest" SET contact_phone = CASE WHEN fid = 1 AND dog = 'dog' THEN null end
    mais je dois lancer ces commandes dans un script, hors de psql et j'ai des problèmes a échapper des single quote (apostrophe) et des colon (deux points) avec des erreurs sur mes tentatives :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    psql -U user -d datab -c 'UPDATE "test.poi.barrest" SET breakfast = CASE WHEN fid = 1 AND breakfast = \'breakfast\' THEN null end'
    psql -U user -d datab -c 'UPDATE "test.poi.barrest" SET contact_phone = CASE WHEN fid = 1 AND contact_phone = `contact\:phone` THEN null end'
    Merci de votre aide

  2. #2
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 717
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 717
    Points : 31 028
    Points
    31 028
    Billets dans le blog
    1
    Par défaut
    Bonjour
    C'est plus un souci shell que sql.

    En shell, les quotes simples inhibent absolument tout. C'est bien pratique quand on doit écrire du awk dans lequel il y a plein de caractères spéciaux tels que accolades, dollar etc mais en retour impossible d'utiliser les quotes simples pour afficher ne serait-ce que le mot "aujourd'hui" (style echo '...') car aucun caractère d'échappement qu'on voudrait placer pour cibler la quote simple représentant l'apostrophe ne fonctionnera vu qu'il sera inhibé par les quotes simples placées aux extrémités de la chaine.

    En shell, la solution souple pour afficher des chaines un peu particulières est d'utiliser les quotes doubles car elles, elles laissent passer certains caractères dont surtout le backslash qui, lui, permettra de cibler les quotes doubles internes de la chaine. Et les éventuelles quotes simples internes, elles, ne seront pas prises en compte (donc seront traitées comme du simple texte).

    Ainsi ton instruction sera psql -U user -d datab -c "UPDATE \"test.poi.barrest\" SET contact_phone = CASE WHEN fid = 1 AND dog = 'dog' THEN null end".

    Accessoirement nommer une colonne "dog" est un peu anti-norme. Le nom d'une colonne doit spécifier la nature de l'information, pas sa valeur. Que se passera-t-il si l'animal change (une information peut évoluer) et devient un chat ?
    Soit la colonne est faite pour stocker le type d'animal et donc tu la nommes "animal" ou un nom similaire ; soit elle est là pour indiquer juste la présence d'un chien ou pas et ok tu peux la nommer "dog" mais dans ce cas elle doit être booléenne et donc ne pouvoir stocker que "vrai" ou" faux".
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  3. #3
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 171
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 171
    Points : 8 359
    Points
    8 359
    Billets dans le blog
    17
    Par défaut
    PI, avec bash, pour un argument délimité par des ' et contenant des ', il faut fermer la chaîne et échapper le ' avec le shell en faisant \'.

    Si je veux afficher foo'bar :

    $ echo 'foo'\''bar'
    Pour ta commande :

    $ psql -U user -d datab -c 'UPDATE "test.poi.barrest" SET breakfast = CASE WHEN fid = 1 AND breakfast = '\''breakfast'\'' THEN null end'
    Jouer avec les " permet d'obtenir des commandes plus claires
    Un problème exposé clairement est déjà à moitié résolu
    Keep It Smart and Simple

  4. #4
    Membre à l'essai
    Homme Profil pro
    Architecte sys d'info géographique
    Inscrit en
    Juin 2011
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Architecte sys d'info géographique
    Secteur : Transports

    Informations forums :
    Inscription : Juin 2011
    Messages : 49
    Points : 19
    Points
    19
    Par défaut
    Merci car ça a marché....

    On en revient à l'aspect SQL, J'ai encore un probleme, ayant testé mon code, que la double condition n'est pas respectée (la ligne 1, où fid = 1 doit aussi comporter "contact_phone" = 'contact:phone', pour lancer le renommage de la colonne entiere.

    Or le renommage de la colonne a été éffectué quand contact_phone était different de 'contact:phone' dans un test que je viens de faire, la double condition n'a pas été respectée.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    UPDATE "test.poi.barrest" SET contact_phone = CASE WHEN fid = 1 AND contact_phone = 'contact:phone' THEN null end
    PS : c'est du Postgresql,
    dans l'exemple de cette capture, diet dairyfree et diet glutenfree par exemple doivent passer à NULL.
    Nom : Capture d’écran_2024-05-26_11-03-44.png
Affichages : 69
Taille : 608,9 Ko

  5. #5
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 171
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 171
    Points : 8 359
    Points
    8 359
    Billets dans le blog
    17
    Par défaut
    La requête suivante :

    UPDATE "test.poi.barrest"
    SET contact_phone = CASE WHEN fid = 1 AND contact_phone = 'contact:phone' THEN null end
    Correspond à ceci :

    UPDATE "test.poi.barrest"
    SET contact_phone = CASE
        WHEN fid = 1 AND contact_phone = 'contact:phone' THEN NULL
        ELSE NULL
    END;
    => Tu "valorises" toujours à NULL.

    Utilise plutôt un WHERE. Met la colonne contact_phone à NULL si fid=1 et contact_phone="contact:phone" :

    UPDATE "test.poi.barrest"
    SET contact_phone = NULL
    WHERE fid = 1 AND contact_phone = 'contact:phone';
    Et comme il ne semble y avoir qu'1 seule ligne fid=1 alors 1 seule ligne sera modifiée

    PS : Pense à faire une sauvegarde
    Un problème exposé clairement est déjà à moitié résolu
    Keep It Smart and Simple

  6. #6
    Membre à l'essai
    Homme Profil pro
    Architecte sys d'info géographique
    Inscrit en
    Juin 2011
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Architecte sys d'info géographique
    Secteur : Transports

    Informations forums :
    Inscription : Juin 2011
    Messages : 49
    Points : 19
    Points
    19
    Par défaut
    seule la ligne avec fid = 1 sera modifiee .. ?
    je voudrais modifier toute la colonne d'un coup.

    Dans ce tableau, si le texte indiqué dans ''contact_phone'' de la premiere ligne (qui a aussi fid = 1), est 'contact:phone' alors je peux etre sur que toute la colonne contiendra la meme valeur : 'contact:phone'.

    C'est pour ca que je veux modifier toutes les lignes d'un coup. je pense que je peux aussi retirer la condition fid=1 pour que toutes les lignes soient concernees, mais je voudrais economiser les ressources de la machine, en considerant que ''si vous trouvez cette valeur dans la premiere ligne, alors toute la colonne contiendra cette valeur sans exception : il faut tout effacer de cette colonne, dans tout le tableau'' plutot que dutiliser des ressources reseau pour verifier chaque ligne, une par une.

  7. #7
    Membre à l'essai
    Homme Profil pro
    Architecte sys d'info géographique
    Inscrit en
    Juin 2011
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Architecte sys d'info géographique
    Secteur : Transports

    Informations forums :
    Inscription : Juin 2011
    Messages : 49
    Points : 19
    Points
    19
    Par défaut
    peut etre ceci ? (j'ai peur de ma syntaxe) mais je voudrais dire au processus quil est inutile de verifier chaque ligne au moment de WHERE

    (des milliards de ligne)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    DO $$
    BEGIN
    IF EXISTS (SELECT FROM "test.poi.barrest" WHERE contact_email='contact:email') THEN
    UPDATE "test.poi.barrest" SET contact_email=null WHERE contact_email='contact:email';
    END IF;
    END $$;

    selon cet exemple en ligne :

    Nom : Screenshot_20240527_141742.jpg
Affichages : 51
Taille : 503,1 Ko

  8. #8
    Membre à l'essai
    Homme Profil pro
    Architecte sys d'info géographique
    Inscrit en
    Juin 2011
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Architecte sys d'info géographique
    Secteur : Transports

    Informations forums :
    Inscription : Juin 2011
    Messages : 49
    Points : 19
    Points
    19
    Par défaut
    Je viens de tester ça, je pense que ça marche (1 tentative reussie) , j'aimerai bien que vous confirmiez si ca tient debout

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    psql -U user -d database -h website.eu -c "UPDATE \"test.poi.barrest\" SET name = CASE WHEN (SELECT COUNT(*) FROM \"test.poi.barrest\" WHERE fid = 1 AND name = 'name' LIMIT 1) > 0 THEN NULL ELSE name END"

  9. #9
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 171
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 171
    Points : 8 359
    Points
    8 359
    Billets dans le blog
    17
    Par défaut
    j'aimerai bien que vous confirmiez si ca tient debout
    Tout dépend ce que tu veux faire, perso je n'ai pas compris
    Un problème exposé clairement est déjà à moitié résolu
    Keep It Smart and Simple

  10. #10
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 237
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 237
    Points : 39 264
    Points
    39 264
    Billets dans le blog
    9
    Par défaut
    Il vrai que ce n'est pas bien clair pour moi non plus.

    Mais il semble que le but est de faire ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    UPDATE ma_table
    SET name = 
        CASE WHEN EXISTS 
                 (SELECT 1 
                  FROM ma_table
                  WHERE fid = 1 
                    AND name = 'name' 
                 )
             THEN NULL 
             ELSE name 
        END

  11. #11
    Membre à l'essai
    Homme Profil pro
    Architecte sys d'info géographique
    Inscrit en
    Juin 2011
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Architecte sys d'info géographique
    Secteur : Transports

    Informations forums :
    Inscription : Juin 2011
    Messages : 49
    Points : 19
    Points
    19
    Par défaut
    Oui, merci pour le code...

    Si la valeur en ligne 1 de name est celle recherchée, alors toute la colonne name doit être effacée sans meme regarder ses valeurs, pour économiser des ressources réseau.

    Si au contraire la valeur en ligne 1 ne contient pas la valeur recherchée, il ne faut qu'aucune valeur soit modifiée, (ici ce serait remplacé par la meme valeur) et dans l'idéal pour economiser des ressources réseau, il faudrait ne plus rien faire et annuler la fonction update, mais ce n'est pas important donc j'y renonce.


    PS : "marquer comme resolu" a disparu de la page.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Lancer une commande depuis un script bash
    Par Newenda dans le forum Shell et commandes GNU
    Réponses: 7
    Dernier message: 04/07/2019, 13h41
  2. Réponses: 3
    Dernier message: 31/08/2008, 16h33
  3. [VB.NET]Lancer une application depuis MonProg
    Par PM_calou dans le forum Windows Forms
    Réponses: 3
    Dernier message: 27/09/2006, 11h42
  4. [VB.NET(2.0)]Lancer une form depuis la forme principale
    Par Dnx dans le forum Windows Forms
    Réponses: 3
    Dernier message: 03/09/2006, 13h08
  5. Lancer une action depuis une autre action
    Par anaon dans le forum Struts 1
    Réponses: 6
    Dernier message: 04/08/2006, 19h38

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo