4
votes

Comment tout récupérer avant la dernière occurrence d'un caractère dans MySQL?

Je veux tout récupérer avant la dernière occurrence d'un caractère spécifique d'une colonne.

SUBSTRING_INDEX avec une valeur négative fonctionne bien pour la séparation mais renvoie la partie de la chaîne que je souhaite supprimer. Par exemple, considérez une colonne comme

UPDATE table1 SET Col1=REPLACE(Col1,SUBSTRING_INDEX(Col1, '.', -1),'')

SUBSTRING_INDEX (Col1, '.', -1) renvoie quatrième , mais je veux obtenir

first. second. third.

En fait, je veux mettre à jour le même col en supprimant quoi que ce soit après la dernière occurrence de . . En d'autres termes, je souhaite supprimer la partie SUBSTRING_INDEX (Col1, '.', -1) , mais je ne peux pas simplement utiliser REPLACE comme

first. second. third. fourth

car cela peut se produire dans d'autres parties de la chaîne.


2 commentaires

Quel est le problème avec votre code? ça semble être du travail


@ D-Shih cela ne fonctionne pas si la colonne est en premier. Quatrième. troisième. quatrième .


3 Réponses :


2
votes

Voici une astuce pour faire ceci, en utilisant la fonction REVERSE :

UPDATE yourTable
SET col =
    REVERSE(SUBSTRING(REVERSE(col), INSTR(REVERSE(col), '.')))

Démo

L'idée ici est d'inverser la chaîne, puis d'utiliser INSTR code> pour trouver la position du dernier point (maintenant le premier). Ensuite, nous sous-passons de la position au début, puis inversons à nouveau.


0 commentaires

1
votes

Vous pouvez utiliser les fonctions left () et Locate ()

DEMO

val
first. second. third. 

OUTPUT:

UPDATE table1 SET Col1= left(col1,
locate(SUBSTRING_INDEX(col1, '.', -1),col1))


1 commentaires

désolé, cela ne fonctionne pas comme mon exemple REPLACE . Il LOCATE () le premier SUBSTRING_INDEX (col1, '.', -1) . Ainsi, cela ne fonctionne pas pour en premier. Quatrième. troisième. quatrième .



2
votes

Je n'utiliserais pas reverse () . Au lieu de cela:

UPDATE table1
    SET Col1 = LEFT(col1, LENGTH(col1) - LENGTH(SUBSTRING_INDEX(Col1, '.', -1)) - 1);


0 commentaires