2013-07-26 5 views
1

Ceci est demandé au sujet d'une base de données Oracle 11g.Puis-je activer plusieurs valeurs stockées dans un seul champ dans un ensemble de lignes à partir d'une instruction select?

Je suis en train d'interroger une table de calendrier Atlassian Confluence. Il stocke les entrées de calendrier pour un calendrier entier dans une seule valeur dans une seule ligne, qui est ce glob gigantesque de merde iCal. Si les champs dans chaque entrée étaient dans un ordre cohérent, mon regex fu serait assez fort pour analyser l'entrée particulière que je recherche ... mais comme j'ai besoin de chercher une date, la description, et le résumé, qui peut apparemment être dans n'importe quel ordre dans le BEGIN/END VEVENT, c'est impossible. Je suis à moitié certain que ce serait impossible même avec lookahead et lookbehind.

Y at-il une construction sql (non pl-sql) qui hachez cette valeur chaîne/blob singulariser en plusieurs lignes, de sorte que je pouvais faire quelque chose comme:

select * from (chopped up value) where x like '%something%'; 

Cela rendrait sorte de l'inverse d'un wm_concat() ou group_concat ...

une entrée typique ressemble à quelque chose comme ça (et il a 50 ou 60 déjà):

BEGIN:VEVENT
 
UID:[email protected]
 
SUMMARY:Richard Smichard
 
ATTENDEE;X-CONFLUENCE-USER=rismich:https://atlassianzzz.zzz.edu/c
 
onfluence/display/~rismich
 
LOCATION:
 
DESCRIPTION:Primary
 
DTSTART;VALUE=DATE:20130726
 
DTEND;VALUE=DATE:20130729
 
DTSTAMP:20130724T153322Z
 
CREATED:20130724T153322Z
 
LAST-MODIFIED:20130724T153322Z
 
ORGANIZER;X-CONFLUENCE-USER=botard:MAILTO:[email protected]
 
SEQUENCE:0
 
END:VEVENT
 

Je ne peux pas utiliser PL-SQL ou construire un accessoire er parser car l'environnement dans lequel il fonctionnera ne rend pas cela possible. Je peux lancer une instruction select, et soit elle renvoie la valeur que je cherche, soit elle ne l'est pas.

En outre, NoSQL suce. Temps fort.

+0

Est-ce que votre soutien dbms CTEs? –

+0

Oracle 11g ... Je dois modifier que –

+0

Utiliser 'regexp_substr. (Chaîne, || '(*) &.' '# X0D;', 1, n, '', 1)' pour obtenir la ligne #n à l'intérieur de 'string'. –

Répondre

1

Ceci est un test rapide:

with w1 as 
(
    select 'BEGIN:VEVENT\ 
UID:[email protected] 
SUMMARY:Richard Smichard 
ATTENDEE;X-CONFLUENCE-USER=rismich:https://atlassianzzz.zzz.edu/c 
onfluence/display/~rismich 
LOCATION: 
DESCRIPTION:Primary 
DTSTART;VALUE=DATE:20130726 
DTEND;VALUE=DATE:20130729 
DTSTAMP:20130724T153322Z 
CREATED:20130724T153322Z 
LAST-MODIFIED:20130724T153322Z 
ORGANIZER;X-CONFLUENCE-USER=botard:MAILTO:[email protected] 
SEQUENCE:0 
END:VEVENT' text from dual 
), 
w2 as 
(
    select 'SUMMARY' label from dual 
    union all 
    select 'DESCRIPTION' label from dual 
) 
select regexp_substr(w1.text, 'UID.*') id, w2.label, 
     substr(regexp_substr(w1.text, w2.label || '.*'), 
       instr(regexp_substr(w1.text, w2.label || '.*'), ':') + 1) spl 
from w1, w2; 

Il donne:

1 UID:[email protected] SUMMARY Richard Smichard 
2 UID:[email protected] DESCRIPTION Primary 
+0

Merci, j'ai réussi à obtenir quelque chose de similaire fonctionnant maintenant ... puis j'ai mis la requête dans Appworx, et elle se plaint parce que le premier mot-clé n'est pas "select", même si c'est toujours une instruction select. J'aimerais pouvoir tuer ce logiciel. –

+0

De rien! J'ai utilisé 'with 'parce qu'il m'a aidé à tester ma solution sans avoir à créer une table physiquement, mais vous pouvez vous en débarrasser mais cibler vos tables directement. – Emmanuel

Questions connexes