Maison > Article > base de données > Étude de cas SQL : fusion et fractionnement de chaînes
Cet article vous apporte des connaissances pertinentes sur SQL server. Il vous présente principalement les informations pertinentes sur la fusion et le fractionnement de chaînes dans l'étude de cas SQL. L'article présente respectivement deux méthodes, qui vous aideront à apprendre ou à utiliser Oracle. certaine valeur d'apprentissage de référence, les amis dans le besoin peuvent s'y référer.
Apprentissage recommandé : "Tutoriel SQL"
Il peut y avoir plusieurs méthodes d'implémentation dans Oracle. Actuellement, il y en a deux que je connais, qui sont enregistrées ci-dessous Implémentation. de ces deux :
Implémentation de SQL :
--方法一 SELECT d.dept_name,wm_concat(e.emp_name) FROM employee e INNER JOIN department d ON d.dept_id=e.dept_id GROUP BY d.dept_name;
Résultats de l'exécution :
Analyse SQL :
Utiliser wm_concat() d'Oracle fonction Il y a un inconvénient lors de la fusion de chaînes, le symbole de connexion pour la fusion ne peut être que la virgule par défaut et aucun autre symbole ne peut être utilisé.
Implémentation de SQL :
--方法二 SELECT d.dept_name, LISTAGG (e.emp_name, ',') WITHIN GROUP (ORDER BY e.emp_name) names FROM employee e INNER JOIN department d ON d.dept_id=e.dept_id GROUP BY d.dept_name;
Résultats d'exécution :
Analyse SQL :
Utilisez la fonction LISTAGG() d'Oracle pour fusionner des chaînes. L'avantage est que le le symbole de connexion fusionné peut être spécifié comme n'importe quel caractère et le tri ORDER BY peut être facilement implémenté.
Il peut y avoir plusieurs méthodes d'implémentation dans Oracle Actuellement, j'en connais deux. L'implémentation de ces deux est enregistrée ci-dessous :
Implémenter. SQL :
--方法一 WITH t (id, name, sub, str) AS ( SELECT id, name, substr(class, 1, instr(class, '、')-1), substr(concat(class,'、'), instr(class, '、')+1) FROM movies UNION ALL SELECT id, name,substr(str, 1, instr(str, '、')-1), substr(str, instr(str, '、')+1) FROM t WHERE instr(str, '、')>0 ) SELECT id, name, sub FROM t ORDER BY id;
Résultat de l'exécution :
Analyse SQL :
Cette instruction est un peu compliquée Voici une explication étape par étape :
Premier coup d'œil à l'original des films. Données du tableau :
1. La première étape consiste à diviser initialement la valeur du champ de classe en deux parties selon le délimiteur (voici la virgule). La première partie est la première valeur du champ de classe à diviser et la deuxième partie est la valeur des parties restantes du champ de classe à diviser.
2. La deuxième étape utilise l'expression AVEC pour implémenter la requête récursive, et boucle pour diviser la valeur non divisée (la deuxième partie) dans la première étape en fonction du séparateur (voici la virgule). le dernier délimiteur du champ, et les données à la fin de la récursion sont placées dans la table temporaire t.
3. La troisième étape est une requête simple pour interroger et trier les enregistrements de la table temporaire t dans la deuxième étape.
Implémentation de SQL :
--方法二 SELECT m.name,t.column_value FROM movies m,TABLE(SPLIT(m.class,'、')) t;
Résultat de l'exécution :
Analyse SQL :
Cette méthode est en fait en personnalisant une fonction ( function) pour traiter les chaînes. La logique de la fonction split est en fait similaire à la logique de la méthode 1. Elles utilisent toutes deux la récursion pour diviser les valeurs de la chaîne une par une en fonction du délimiteur, et finalement renvoyer la chaîne divisée. Personnellement, je pense que cette méthode est meilleure car elle encapsule la logique de fractionnement, la rendant plus simple à utiliser et plus claire en logique.
Ce qui suit est le script de création de la fonction split :
create or replace function split (p_list clob, p_sep varchar2 := ',') return tabletype pipelined is l_idx pls_integer; v_list varchar2 (32676) := to_char(p_list); begin loop l_idx := instr (v_list, p_sep); if l_idx > 0 then pipe row (substr (v_list, 1, l_idx - 1)); v_list := substr (v_list, l_idx + length (p_sep)); else pipe row (v_list); exit; end if; end loop; end;
Le type de valeur de retour de la fonction, tabletype, est également un type personnalisé.
Voici le script de création de ce type :
create or replace type tabletype as table of varchar2(32676);
Apprentissage recommandé : "Tutoriel SQL"
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!