8
votes

Comment mieux diviser les cordes CSV à Oracle 9i

Je veux pouvoir diviser les chaînes de CSV dans Oracle 9i

J'ai lu l'article suivant http://www.oappssurd.com/2009/03/string -split-in-or-oracle.html

Mais je n'ai pas compris comment faire ce travail. Voici quelques-unes de mes questions qui se relaientes

  1. Cela fonctionnerait-il à Oracle 9i, sinon, pourquoi pas?
  2. Y a-t-il un meilleur moyen d'aller faire la division des chaînes de CSV alors la solution présentée ci-dessus?
  3. Dois-je créer un nouveau type? Si oui, ai-je besoin de privilings spécifiques pour cela?
  4. Puis-je déclarer le type w / dans la fonction?

0 commentaires

5 Réponses :


2
votes

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. xxx

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 .


1 commentaires

Oui, j'ai lu son article asktom.oracle.com/pls/asktom/...



2
votes

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 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>

Dans ce qui suit, vous pouvez définir : smycatagories code> égal à '1,2,3,4' code> p> xxx pré>

et l'utiliser dans une instruction SELECT .... p>

SELECT 
  *
FROM
  atable a 
WHERE 
  a.category in (1,2,3,4);


1 commentaires

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.



8
votes

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: xxx pré>

Vous pouvez l'utiliser comme ceci: p>

select tokenize('hi you person', ' ') from dual;
VARCHAR(hi,you,person)


1 commentaires

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.



17
votes

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> xxx pré>

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> xxx pré>

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.


4 commentaires

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



2
votes

J'ai utilisé ceci à la fin xxx


xxx

0 commentaires