Maison >base de données >tutoriel mysql >Comment diviser et filtrer efficacement une colonne VARCHAR séparée par des virgules dans SQL ?

Comment diviser et filtrer efficacement une colonne VARCHAR séparée par des virgules dans SQL ?

DDD
DDDoriginal
2024-12-24 17:48:12183parcourir

How to Efficiently Split and Filter a Comma-Separated VARCHAR Column in SQL?

Diviser une colonne VARCHAR en plusieurs valeurs dans SQL

Le type de données VARCHAR dans SQL permet le stockage de données de caractères de longueur variable. Souvent, il est nécessaire de diviser une colonne VARCHAR en plusieurs valeurs pour faciliter le filtrage des données ou d'autres opérations.

Considérez l'exemple suivant :

SELECT 
  AD_Ref_List.Value
FROM AD_Ref_List
WHERE AD_Ref_List.AD_Reference_ID= 1000448

Cette requête récupère une colonne nommée "Valeur" à partir de la table "AD_Ref_List" où la colonne "AD_Reference_ID" est égale à 1000448. Le résultat est une liste de valeurs :

CO,VO

Cependant, l'exigence est de limiter les résultats en fonction des valeurs stockées dans une table différente, "xx_insert":

SELECT xx_insert.XX_DocAction_Next
  FROM xx_insert
  WHERE xx_insert_id = 1000283

Le résultat de cette requête est :

CO

Le défi réside dans la modification de la requête d'origine pour incorporer les valeurs de "xx_insert" tout en conservant le format séparé par des virgules. La tentative initiale a transformé les valeurs en une chaîne délimitée :

AD_Ref_List.Value IN ('CO,VO')

Ce qui n'est pas le résultat souhaité.

Solution :

Pour résoudre ce problème problème, les valeurs de la clause IN doivent être entourées du délimiteur approprié et vérifiées par rapport à une liste séparée par des virgules également entourée de délimiteurs :

SELECT r.Value
FROM   AD_Ref_List r
       INNER JOIN xx_insert x
       ON ( ',' || x.XX_DocAction_Next || ',' LIKE '%,' || r.value || ',%' )
WHERE  r.AD_Reference_ID = 1000448
AND    x.xx_insert_id    = 1000283;

Cette technique permet d'identifier les valeurs qui correspondent à la liste séparée par des virgules. Alternativement, une approche plus efficace utilisant le filtrage des valeurs de ligne peut également être utilisée :

SELECT Value
FROM   AD_Ref_List
WHERE  AD_Reference_ID = 1000448
AND    value IN (
  SELECT REGEXP_SUBSTR( XX_DocAction_Next, '[^,]+', 1, LEVEL )
  FROM   xx_insert
  WHERE  xx_insert_id    = 1000283
  CONNECT BY LEVEL <= REGEXP_COUNT( XX_DocAction_Next, '[^,]+' )
);

Les deux solutions divisent efficacement la colonne VARCHAR en plusieurs valeurs et filtrent en fonction des valeurs spécifiées, résolvant ainsi le problème rencontré lors de la configuration initiale. requête.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn