70 votes

Mysql peut-il fractionner une colonne ?

J'ai une colonne qui contient des données séparées par des virgules :

1,2,3
3,2,1
4,5,6
5,5,5

J'essaie d'exécuter une recherche qui interrogerait chaque valeur de la chaîne CSV individuellement.

0<first<5   and  1<second<3  and  2<third<4 

Je comprends que je pourrais retourner toutes les requêtes et les diviser moi-même et les comparer moi-même. Je suis curieux de savoir s'il existe un moyen de faire cela pour que mysql fasse ce travail de traitement. Merci !

53voto

raj karthy Points 21

Utilice

substring_index(`column`,',',1) ==> first value
substring_index(substring_index(`column`,',',-2),',',1)=> second value
substring_index(substring_index(`column`,',',-1),',',1)=> third value

dans votre clause where.

SELECT * FROM `table`
WHERE 
substring_index(`column`,',',1)<0 
AND
substring_index(`column`,',',1)>5

3 votes

J'ai dû utiliser substring_index(substring_index( column ,',',-1),',',1) pour obtenir la deuxième valeur. L'utilisation de -2 me donnait systématiquement la première valeur. Mais ça a bien marché :)

0 votes

Les indices dans cette réponse deviennent un peu confus au fur et à mesure que vous ajoutez des lignes.

0 votes

Excellente solution. Elle a fonctionné. Merci.

24voto

Andriyev Points 9238

La fonction de division des chaînes de caractères est absente de MySQL. Vous pouvez rédiger une fonction de votre choix. Veuillez consulter ce lien http://blog.fedecarg.com/2009/02/22/mysql-split-string-function/

salutations

4voto

Damo Points 7792

Vous pouvez obtenir ce que vous voulez en utilisant le REGEXP ou le LIKE de MySQL.

Ver el Documents MySQL sur la correspondance de motifs

1voto

Merijn Vogel Points 1

Comme un addendum à cela, j'ai des chaînes de la forme : Quelques mots 303

où je voudrais séparer la partie numérique de la queue de la chaîne. Cela semble indiquer une solution possible :

http://lists.mysql.com/mysql/222421

Le problème, cependant, est que vous n'obtenez que la réponse "oui, cela correspond", et non l'indice de départ de la correspondance regexp.

1voto

KCD Points 1566

Voici une autre variante que j'ai postée sur une question connexe. Le site REGEX Il est utile de vérifier si vous êtes hors limites, donc pour une colonne de tableau, vous le mettez dans la clause where.

SET @Array = 'one,two,three,four';
SET @ArrayIndex = 2;
SELECT CASE 
    WHEN @Array REGEXP CONCAT('((,).*){',@ArrayIndex,'}') 
    THEN SUBSTRING_INDEX(SUBSTRING_INDEX(@Array,',',@ArrayIndex+1),',',-1) 
    ELSE NULL
END AS Result;
  • SUBSTRING_INDEX(string, delim, n) renvoie les n premiers
  • SUBSTRING_INDEX(string, delim, -1) renvoie uniquement le dernier
  • REGEXP '((delim).*){n}' vérifie s'il y a n délimiteurs (c'est-à-dire que vous êtes dans les limites)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X