2017-09-03 3 views
0

J'ai les entrées de résultat SQL suivantes.Extrait une chaîne imbriquée de la colonne de texte

Result 
--------- 
TW - 5657980 Due Date updated : to <strong>2017-08-13 10:21:00</strong> by <strong>System</strong> 
TW - 5657980 Priority updated from <strong> Medium</strong> to <strong>Low</strong> by <strong>System</strong> 
TW - 5657980 Material added: <strong>1000 : Cash in Bank - Operating (Old)/ QTY:2</strong> by <strong>System</strong>#9243 
TW - 5657980 Labor added <strong>Kelsey Franks/14:00 hours </strong> by <strong>System</strong>#65197 

Maintenant, je suis en train d'extraire une brève description de ce résultat et d'essayer de migrer vers l'autre colonne de la même table.

Expected result 
-------------- 
Due Date Updated 
Priority Updated 
Material Added 
Labor Added 

Ignorer les 13 premiers caractères. Pour la plupart des cas, il se termine par «mis à jour». Quelques-uns se terminent par «ajouté». Il devrait être insensible à la casse.
Y a-t-il un moyen d'obtenir le résultat attendu?

+0

Il n'y a pas assez d'informations pour définir votre tâche. –

+0

@Erwin: Je veux extraire une chaîne en sql et je veux obtenir le résultat comme mentionné. –

+0

L'information importante manquante: la "description courte" se termine-t-elle toujours par "mise à jour" ou "ajoutée"? Sensible aux majuscules et minuscules? (Et aucun de ces mots n'apparaît plus d'une fois?) Est-ce que la partie principale que nous ignorons toujours exactement 13 caractères? Ou comment d'autre part le début et la fin de la chaîne sont-ils définis exactement? –

Répondre

1

Solution avec substring() en utilisant une expression régulière. Il saute les 13 premiers caractères, puis prend la chaîne au premier 'mis à jour' ou 'ajouté', insensible à la casse, avec premier blanc. Else NULL:

SELECT substring(result, '(?i)^.{13}(.*? (?:updated|added))') 
FROM tbl; 

L'expression rationnelle explique:

(?i) .. meta-syntax pour passer à la casse correspondant
^ .. début de la chaîne
.{13} .. sauter les 13 premiers caractères
() .. capture parenthèse (capture la charge utile)
.*? .. n'importe quel nombre de caractères (non-greedy)
(?:) .. parenthèses non-capture
(?:updated|added) .. 2 branches (chaîne se termine par 'mise à jour' ou 'ajoutée')


Si nous ne pouvons pas compter sur 13 grands personnages like you later commented, nous avons besoin autre définition fiable à la place. Votre difficulté semble avec des exigences floues plus qu'avec la mise en œuvre réelle.

Say, nous avons affaire à 1 ou plusieurs non-chiffres, suivi par 1 ou plusieurs chiffres, un espace, puis la charge utile telle que définie ci-dessus:

SELECT substring(result, '(?i)^\D+\d+ (.*? (?:updated|added))') ... 

\d .. raccourci de classe pour les chiffres
\D .. non-chiffres, le contraire de \d

+0

Merci pour l'info. Est-il possible de trouver 13 caractères de longueur? J'ai trouvé que si ses 12 ou 11 caractères donnent alors le mauvais résultat. –

+0

ce sera bien si nous obtenons des caractères dynamiques longueur.Parfois, ses 10, 11, 12 ou 13. –

+0

@PranavUnde: Tout est possible, il suffit de donner des informations complètes * dans la question *. Qu'est-ce qui définit le début de la chaîne sinon la position 14? Le premier non-chiffre après la première séquence de chiffres et un blanc? J'ai ajouté une autre solution basée sur ma supposition éclairée. –