Bonjour tout le monde.
Un peu de contexte: je reçois une base brute avec quelques données mal normalisées, et je veux les améliorer.
Comme je ne reçois pas de patch de la base, mais des bases de remplacement, je veux créer un fichier de requetes sql à jouer à chaque fois.
Concretement, mon sujet est de trouver les Objets qui a tout les Tags que demande une Action
Par exemple, l'Objet (A, B, C) est une cible valide pour une Action qui requiert A et B, mais pas pour une demandant D. (J'ai aussi des requetes négatives, genre "pas B", mais ca n'est pas la question)
Mon objectif réel est d'obtenir une vue action_targets(action_id, object_id).
J'avais déjà réussi à traiter ca dans le temps, mais ma source de données à changée en pire.
Avant, j'avais object_tags(object_id, tag), et action_tags(action_id, tag) avec une ligne par tag, et je m'en sortais avec une série de jointures.
Maintenant, action_tags n'existe plus, et je n'ai plus qu'une unique chaine de texte (html!) dans action.
J'ai réussi à extraire les parties marquées comme des tags dans le texte, mais il y a un hic. Les frontières des tags ne sont pas les bonnes: certains tags ont des espaces.
Par exemple, j'ai maintenant "[a] [b] [c] [d]", mais l'intention était "[a b] [c] [d]".
J'ai la liste des intentions possibles, mais il y a des recouvrements: en l'occurence, il y a "[a]", "[b]", "[a b]" et "[a b with f]".
Si j'ai bien "[u v]" mais ni "[u]" ni "[v]", je sais d'avance pouvoir recoller u et v.
Je n'arrive pas à trouver comment recréer action_tags. Avez vous des idées?
Je suis peut-être en train de XY le mauvais problème. Peut-être devrais-je chercher à composer des phrases avec les tags des objets, et de les recoller avec les actions?
Voici là où j'en suis arrivée: (en bonus, il y a une différence de majuscules (que like résout) et la gestion des crochets).
pour le débug, on peut remplacer le dernier select par select * from sqe;.
Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32 with recursive known_tags(tag) as ( -- represents a select distinct tag from object_tags order by length(tag) values ('a b theta'), ('a b'), ('c d'), ('a'), ('b'), ('e') ), input(data) as ( values ('[a] [b] [c] [d] [e]') ), sqe(tags, tail) as ( select null, data from input union all select iif(tags is null, keyword, tags ||','|| keyword), substr(tail, length(bracketed) + 2) from sqe join ( select tag, '[' || replace(tag, ' ', '] [') || ']' as bracketed from known_tags order by length(tag) desc ) as mappings on sqe.tail like bracketed || '%' ) select tags from sqe where tail = '';
Je ne dois pas être loin, j'ai la bonne réponse (a b,c d,e) et un faux positif (a,b,c d,e), je ne vois pas comment rejeter 'a' sur la base de l'existence de 'a b' dans known_tags.
Merci à vous!
Partager