Je veux pouvoir diviser les chaînes de CSV dans Oracle 9i P>
J'ai lu l'article suivant http://www.oappssurd.com/2009/03/string -split-in-or-oracle.html p>
Mais je n'ai pas compris comment faire ce travail. Voici quelques-unes de mes questions qui se relaientes p>
5 Réponses :
On dirait que vous ne voulez pas ajouter de schéma (types, fonction). Un moyen SQL uniquement pour analyser le texte délimité est de «devenir fou» avec les appels d'instrtr et de substruisement. Si vous souhaitez formaliser une structure et ajouter le code d'application approprié (fonctions, vues, types, etc.) Je jetterais un coup d'oeil à Tom Kyte's Écrire sur ce Sujet . P> p>
Oui, j'ai lu son article asktom.oracle.com/pls/asktom/...
Vous voudrez peut-être être un peu plus clair sur ce que vous voulez faire, alors nous pouvons vous donner une réponse spécifique. Montrant que certains de votre code sont toujours utiles :)
Si vous utilisez des paramètres, de scinder une chaîne de numéros de CSV (par exemple: 1,2,3,4), utilisez-le dans un Dans ce qui suit, vous pouvez définir et l'utiliser dans une instruction SELECT .... p> dans code> Déclaration aperçu de la fonction
str2tbl () code> dans Question 670922 . Avec quelques modifications, vous pouvez le modifier à un
varchar2 code> ou tout ce que vous avez besoin. P>
: smycatagories code> égal à
'1,2,3,4' code> p>
SELECT
*
FROM
atable a
WHERE
a.category in (1,2,3,4);
Fondamentalement, je voulais juste pivoter les données CSV et vouloir voir si je peux le faire sans avoir à créer un nouveau type, car je n'ai pas le privilège.
Voici un tokéniseur à chaîne pour Oracle qui est un peu plus simple que cette page, mais aucune idée si elle est aussi rapide: Vous pouvez l'utiliser comme ceci: p> select tokenize('hi you person', ' ') from dual;
VARCHAR(hi,you,person)
C'est une très bonne méthode, toujours applicable même jusqu'à 11g au moins. Cette méthode est rapide car vous ne redémarrez pas votre analyse à chaque fois de la position zéro, mais continuez à analyser l'endroit où vous vous êtes arrêté. J'ai développé un peu de contrôle de la manutention un peu différent, posté sur Mon blog sur l'analyse d'une chaîne avec un CSV en plusieurs colonnes . C'est un peu similaire, mais je suis allé l'itinéraire avec une fonction pipeline et un moyen étrange d'utiliser une jointure cartésienne. J'ai des résultats dans des colonnes individuelles.
Joyce,
Voici trois exemples: P>
1) en utilisant dbms_utility.ca_to_table. Ce n'est pas une routine générale, car les éléments doivent être des identifiants valides. Avec des tours sales, nous pouvons le rendre plus universel: p> 2) en utilisant la connexion de SQL par niveau. Si vous êtes sur 10g ou plus, vous pouvez utiliser l'approche de connexion en combinaison avec des expressions régulières, comme celle-ci: p> 3) à nouveau à l'aide de SQL Connect par niveau, Mais maintenant, en combinaison avec de bonnes anciennes substruisines / instrtes au cas où vous seriez sur la version 9, comme si vous êtes: p> SQL> truncate table normalized_table
2 /
Table truncated.
SQL> insert into normalized_table (value)
2 select substr
3 ( col
4 , instr(col,',',1,l) + 1
5 , instr(col,',',1,l+1) - instr(col,',',1,l) - 1
6 )
7 from ( select ',' || col || ',' col from csv_table )
8 , ( select level l from dual connect by level <= 100 )
9 where l <= length(col) - length(replace(col,',')) - 1
10 /
14 rows created.
SQL> select * from normalized_table
2 /
VALUE
----------
a
a
zz
sd
bb
yy
dfg
ccc
31456
dddd
dasd
sdfsdf
14 rows selected.
Je pense qu'utiliser dbms_utility.ca_to_table est bon. C'est légèrement hors sujet. Comment ferais-je cette exécution sur une colonne qui est pleine de ces valeurs CSV et insérez-les dans une nouvelle table? Désolé, je suis très très nouveau à Oracle. Appréciez ça! Joyce
J'ai ajouté une section à la réponse pour adresser votre commentaire.
Bonjour Rob, la solution n ° 2 [Utilisation de SQL Connect par niveau] fonctionne bien pour moi.Mais maintenant, j'ai une exigence de transmission de 2 cordes de CSV [longueur égale] comme entrée de PL / SQL stocké Proc.Et, j'ai besoin Pour insérer des valeurs de ces deux cordes CSV dans deux colonnes différentes de la table.Ceuds-tu s'il vous plaît laissez-moi savoir comment y aller?
Le numéro 2 est génial
J'ai utilisé ceci à la fin