web-dev-qa-db-fra.com

SQL SELECT tout après un certain caractère

Je dois tout extraire après le dernier '=' ( http://www.domain.com?query=blablabla -> blablabla) mais cette requête renvoie les chaînes entières. Où est-ce que je me suis trompé ici?

SELECT RIGHT(supplier_reference, CHAR_LENGTH(supplier_reference) - SUBSTRING('=', supplier_reference)) 
FROM ps_product
26
popkutt
select SUBSTRING_INDEX(supplier_reference,'=',-1) from ps_product;

Veuillez utiliser http://www.w3resource.com/mysql/string-functions/mysql-substring_index-function.php pour plus de références.

46
virus

Essayez ceci (cela devrait fonctionner s'il y a plusieurs caractères '=' dans la chaîne):

SELECT RIGHT(supplier_reference, (CHARINDEX('=',REVERSE(supplier_reference),0))-1) FROM ps_product
7
BWS

Essayez ceci dans MySQL.

right(field,((CHAR_LENGTH(field))-(InStr(field,','))))
4
Mohsin

En MySQL, cela fonctionne s'il y a plusieurs caractères '=' dans la chaîne.

SUBSTRING(supplier_reference FROM (LOCATE('=',supplier_reference)+1))

Il retourne la sous-chaîne après (+1) après avoir trouvé le premier =

1
Ludo

J'ai travaillé sur quelque chose de similaire et après quelques essais et échecs, j'ai trouvé ceci:

Exemple: STRING-TO-TEST-ON = 'ab, cd, ef, gh'

Je voulais tout extraire après la dernière occurrence de "," (virgule) de la chaîne ... donnant ainsi "gh".

Ma requête est:

SELECT SUBSTR('ab,cd,ef,gh' FROM (LENGTH('ab,cd,ef,gh') - (LOCATE(",",REVERSE('ab,cd,ef,gh'))-1)+1)) AS `wantedString`

Maintenant laissez-moi essayer d’expliquer ce que j’ai fait ...

  1. Je devais trouver la position du dernier "," dans la chaîne et calculer la longueur de wantedString, en utilisant LOCATE(",",REVERSE('ab,cd,ef,gh'))-1 en inversant la chaîne initiale, je devais trouver la première occurrence de "," dans la chaîne ... qui n'était pas Difficile de faire ... et ensuite -1 pour trouver réellement la longueur de la chaîne sans le ",".

  2. calcule la position de ma chaîne wanted en soustrayant la longueur de la chaîne que j'ai calculée au 1er pas de la longueur de la chaîne initiale: 

    LONGUEUR ('ab, cd, ef, gh') - (LOCATE (",", REVERSE ('ab, cd, ef, gh')) - 1) +1

J'ai (+1) parce que j'ai réellement besoin de la position de la chaîne après le dernier "," .. et ne contenant pas le ",". J'espère que cela a du sens.

  1. tout ce qui reste à faire est d’exécuter un SUBSTR sur ma chaîne initiale à partir de la position calculée.

Je n'ai pas testé la requête sur des chaînes de grande taille, donc je ne sais pas à quel point c'est lent. Donc, si quelqu'un le teste réellement sur une grosse chaîne, je serais très heureux de connaître les résultats.

0
Rosu Flavius

Pour SQL Management studio, j'ai utilisé une variante de la réponse de BWS. Cela donne les données à la droite de '=', ou NULL si le symbole n'existe pas:

   CASE WHEN (RIGHT(supplier_reference, CASE WHEN (CHARINDEX('=',supplier_reference,0)) = 0 THEN
    0 ELSE CHARINDEX('=', supplier_reference) -1 END)) <> '' THEN (RIGHT(supplier_reference, CASE WHEN (CHARINDEX('=',supplier_reference,0)) = 0 THEN
    0 ELSE CHARINDEX('=', supplier_reference) -1 END)) ELSE NULL END
0
Jacob Morris