Forum Programmation.SQL Recherche d'un pattern dans une table

Posté par .
Tags : aucun
1
1
mar.
2010
Bonjour, j'aimerais savoir si il est possible de faire une recherche dans une table qui contiendrait des motifs, en recherchant à partir d'une chaine.

Petit exemple, à mon avis bien plus compréhensible...
Table
------------
pattern
label

pattern | label
---------------------
ab      | commence par ab
abcd    | commence par abcd
xyz      | commence par xyz


Il faudrait pouvoir retrouver la ligne grâce à une chaine de caractères, un peu de cette façon ci :
"SELECT * FROM Table WHERE 'chaine' LIKE pattern%"

Bref, faire une recherche sur la version abrégée du motif de recherche. Si je peux avoir la chaine la plus représentative ("abcd" plutôt que "ab" pour "abcdef") en plus .. c'est un plus !

Mais déjà est-ce possible ?
  • # Trouvé

    Posté par . Évalué à 1.

    La solution est très simple, elle m'est apparue juste après avoir posté le message... pour ceux que ça intéresse

    SELECT * FROM `Table` WHERE "abcdef" LIKE CONCAT(pattern,'%')

    Me reste plus qu'à trouver comment trouver la plus longue ..
    • [^] # Re: Trouvé

      Posté par . Évalué à 1.

      Et pour avoir la plus longue ...

      SELECT * FROM societes
      WHERE 'BASFERG' LIKE CONCAT(nom,'%')
      AND CHAR_LENGTH(nom) =
      (
      SELECT MAX(CHAR_LENGTH(nom))
      FROM societes
      WHERE 'BASFERG' LIKE CONCAT(nom,'%')
      )

      Je me trompe sans doute, mais la solution semble être assez gourmande, n'y a-t-il pas plus simple pour le SGBD?
      • [^] # Re: Trouvé

        Posté par . Évalué à 2.

        Peut-être en faisant un ORDER sur la longueur de la chaîne ce qui permet de ne pas écarter de résultat et d'obtenir le ou les plus long en premier.
        • [^] # Re: Trouvé

          Posté par . Évalué à 1.

          Bizarrement, j'y ai pas pensé... ça devrait déjà soulager un brin, merci :)
  • # pattern matching sans wildcards

    Posté par . Évalué à 2.

    select
    (
    ( LEFT(foo,1) = "a" )
    +
    ( 2 * LEFT(foo,2) = "ab" )
    +
    ( 4 * LEFT(foo,3) = "abc" )
    +
    ( 8 * LEFT(foo,4) = "abcd" )
    +
    ...
    ) AS rank
    ORDER by rank

Suivre le flux des commentaires

Note : les commentaires appartiennent à ceux qui les ont postés. Nous n'en sommes pas responsables.