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

Requêtes PostgreSQL Discussion :

Recherche de sous-chaîne


Sujet :

Requêtes PostgreSQL

  1. #1
    Membre à l'essai
    Inscrit en
    Avril 2011
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Avril 2011
    Messages : 16
    Points : 11
    Points
    11
    Par défaut Recherche de sous-chaîne
    bonjour,

    je travaille avec postgresql 11

    J'ai du texte et je veux extraire une sous-chaîne de ce texte :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "|a john dumas .|d 1941|e united states|=^A22306"
    le résultat correct doit être john dumas .1941

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "|a john dumas .|e united states|=^A22306"
    le résultat correct doit être john dumas .

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "|a john dumas .|=^A22306 |e united states |d 1941 |f admin "
    le résultat correct doit être john dumas .1941

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "|a john dumas .|f admin |d 1941  |=^A22306 |e united states"
    le résultat correct doit être john dumas .1941

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "|a john dumas .|f admin |d 1941 "
    le résultat correct doit être john dumas .1941

    le résultat correct doit être john dumas .

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "john dumas .|e united states |d 1941 "
    le résultat correct doit être john dumas .1941

    le résultat correct doit être john dumas .


    si le texte contient |a alors lisez depuis |a jusqu'à trouver le premier caractère | et si le texte contient |d alors lisez à partir de |d jusqu'à trouver le premier caractère | après |d comme exemple 1 et 3 et 4

    si le texte contient |a alors lisez depuis |a jusqu'à trouver le premier caractère | et si le texte contient |d et ne contient aucun caractère | après |d donc lire de |d jusqu'à la fin du texte comme exemple 5

    si le texte contient |a et si le texte ne contient aucun caractère | après |a donc lire de |a jusqu'à la fin du texte comme exemple 6


    si le texte contient |a et ne contient aucun caractère |d, alors lisez à partir de |a jusqu'à ce que vous trouviez le premier caractère | après |a comme exemple 2


    si le texte ne contient pas |a lit le texte depuis le début jusqu'à trouver le premier caractère | et si le texte contient |d et ne contient aucun caractère | après |d donc lire de |d jusqu'à la fin du texte comme exemple 7


    si le texte ne contient pas |a et ne contient aucun caractère | donc lisez tout le texte depuis le début comme l'exemple 8


    l'objectif principal de tous les exemples est de lire à partir de |a et de |d et si le texte ne contient pas |a, alors lisez depuis le début du texte.

    Je veux avoir une seule requête select qui peut traiter tous ces exemples.

    J'essaie avec ce code, mais le problème est que ce code ne donne le résultat correct que pour le premier exemple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    select  replace(substring('|a john dumas .|d 1941|e united states|=^A22306' from '\|a(.+)\|e'), '|d', '')

    le résultat est correct " john dumas . 1941"

    quelqu'un peut-il m'aider à résoudre ce problème



    merci d'avance

  2. #2
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 857
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 857
    Points : 6 555
    Points
    6 555
    Par défaut
    Tu peux utiliser regexp_replace pour une description fine des différentes chaînes et la possibilité de capturer des parties précises:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select regexp_replace('|a john dumas .|d 1941|e united states|=^A22306', '^(?:\|a )?([^|]*[^|\s])(?:.*\|d ([^|]*[^|\s]))?.*', '\1\2');
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select regexp_replace('|a john dumas .|d 1941|e united states|=^A22306', '^(\|a )?([^|]*[^|\s])(.*\|d ([^|]*[^|\s]))?.*', '\2\4');
    demo

    Ou en utilisant la syntax BRE (Basic Regular Expression):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select regexp_replace('|a john dumas .|d 1941|e united states|=^A22306', '^\(|a \)\{0,1\}\([^|]*[^|[:space:]]\)\(.*|d \([^|]*[^|[:space:]]\)\)\{0,1\}.*', '\2\4', 'b');
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

  3. #3
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 755
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 755
    Points : 52 524
    Points
    52 524
    Billets dans le blog
    5
    Par défaut
    Je n'ai pas PG sous la main, mais vous pouvez utiliser les fonctions d'agrégation littérale et de découpage de chaine pour ce faire....

    Voici une solution sous MS SQL Server :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    DECLARE @STRING VARCHAR(256) = '|a john dumas .|d 1941|e united states|=^A22306';
    WITH 
    T AS
    (
    SELECT value, LEFT(value, 2) AS L, RIGHT(value, LEN(value) - 2) AS R
    FROM   STRING_SPLIT(@STRING, '|')
    WHERE  value <> ''
    )
    SELECT STRING_AGG(R, ' ')
    FROM   T
    WHERE  L IN ('a', 'd')
    Le résultat dans la table T est celui-ci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    value              L    R
    ------------------ ---- ----------------
    a john dumas .     a    john dumas .
    d 1941             d    1941
    e united states    e    united states
    =^A22306           =^   A22306
    on filtre sur a et d et on fait un concaténation agrégative...

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

Discussions similaires

  1. Recherche de sous chaîne en récursif
    Par Kriegor D Will dans le forum Débuter
    Réponses: 9
    Dernier message: 21/06/2013, 10h33
  2. Recherche une sous chaîne de caractères dans un Vector
    Par brino1987 dans le forum API standards et tierces
    Réponses: 5
    Dernier message: 12/06/2013, 14h31
  3. Algorithmie, recherche de sous chaînes
    Par vince85 dans le forum Général Java
    Réponses: 9
    Dernier message: 01/05/2011, 18h27
  4. Réponses: 16
    Dernier message: 10/01/2008, 15h12
  5. Recherche de sous chaîne
    Par Sebou77 dans le forum Algorithmes et structures de données
    Réponses: 7
    Dernier message: 31/03/2006, 19h24

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