Maison >base de données >tutoriel mysql >Comment diviser et filtrer efficacement une colonne VARCHAR séparée par des virgules dans 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!