Comment scinder une chaîne de valeur basée sur un délimiteur dans DB2
Comment découper une chaîne de valeur dans DB2?
Par exemple, compte tenu de la valeur:
CHG-FFH.
Je veux split sur le tiret (-), ce qui aboutirait à deux valeurs:
CHG
FFH.
J'ai essayé d'utiliser la fonction split, mais ce n'est pas une fonction dans DB2.
Toute aide sera appréciée.
OriginalL'auteur sTg | 2013-09-23
Vous devez vous connecter pour publier un commentaire.
Réponse courte:
BONUS! Si vous faites cela souvent, créer une fonction définie par l'utilisateur pour le faire de façon dynamique. Voici un exemple dans une base de violon.
Sinon, vous pouvez voir une approche différente ici, à cette réponse: Diviser un VARCHAR dans DB2 pour récupérer une valeur à l'intérieur.
Réponse longue:
DB2, avec d'autres bases de données relationnelles ne fournissent pas une seule fonction pour accomplir cette tâche.
La raison en est probablement que ce n'est pas implicitement une fonction scalaire. Si votre chaîne avait plus d'un tiret, voulez-vous de le diviser en trois parties? Quatre? Donc, la première étape est à noter que si vos données est déterminée, - si il y a un certain nombre de composants que vous souhaitez vous séparer. Dans votre exemple, vous avez les deux, alors je vais commencer avec cette hypothèse, et puis par la suite des commentaires sur la façon de traiter les autres situations.
Scénario: Une chaîne de valeur avec deux composants séparés par un délimiteur
Avec seulement deux pièces, vous devez trouver la position du séparateur, puis sous-chaîne de caractères avant et après à l'aide de la position avant et après les avoir dans une fonction de sous-chaîne.
REMARQUE: DB2 fournit deux fonctions qui peuvent être utilisées pour cela: POSITION (ou POSSTR), et LOCALISER (ou LOCATE_IN_STRING). RECHERCHEZ est un peu plus puissante, car elle permet de définir la position de départ, ce qui serait utile si vous avez eu plus d'un délimiteur.
Pour la première partie, démarrez votre sous-chaîne à la position 1, vers le caractère avant le délimiteur (délimiteur de position - 1):
Pour la deuxième partie, démarrez votre sous-chaîne à la position après le délimiteur index (délimiteur de position + 1), et obtenir le reste de la Chaîne:
Résultat Final:
Scénario: Une chaîne de valeur avec trois composants séparés par un délimiteur
Utiliser les mêmes concepts que le premier scénario, mais vous devez déterminer l'indice de la deuxième séparateur. Utiliser l'index du premier caractère de séparation utilisé pour spécifier un point de départ: à Noter que RECHERCHEZ permet de spécifier une position de départ:
Trouver le second délimiteur:
D'utiliser la position du premier délimiteur comme le point de départ pour trouver le second délimiteur.
De l'utiliser comme un SUBSTR point pour les deuxième et troisième valeurs, et vous êtes tous ensemble. Remarque: Pour la deuxième valeur, vous devez utiliser à la fois du séparateur de lieux à sous-chaîne de la valeur.
Résultat Final:
Vous pouvez le voir, cette stratégie permettrait de sortir de la main pour un plus grand nombre de séparateurs dans votre Chaîne.
Scénario: durée Indéterminée nombre de séparateurs
C'est un problème délicat qui est le mieux approché avec une Procédure Stockée. Pensez à travers des choses comme: Comment voulez-vous que l'analyse des données de l'algorithme, comment allez-vous pour accéder aux données? Les tableaux ne sont pas un type natif, en SQL, mais ils sont dans des Procédures Stockées, de sorte qu'allez-vous faire avec le tableau lorsque vous avez analysé toutes les pièces de votre Chaîne?
Une manière d'aborder ce scénario est la réponse ici:
Diviser un VARCHAR dans DB2 pour récupérer une valeur à l'intérieur
Oui! c'est vrai, @user3606336. Je n'avais pas remarqué avant que mon exemple ne fonctionne pas correctement. Je vais mettre à jour ma réponse à votre correction. Merci!
Il serait très facile à mettre en œuvre une analyse de la fonction('VAR-FFH-EEE',2,'-') qui retourne le deuxième mot, où les mots sont séparés par des '-'
merci pour la suggestion. J'ai ajouté une Fonction Définie par l'Utilisateur (UDF) à ma réponse, et lié à un violon qui le démontre. Bonne idée!
OriginalL'auteur Josh Hull
C'est ce que j'ai essayé et il a cherché moi un résultat efficace. Donc partage avec tous.
OriginalL'auteur sTg
Essayer cette déclaration:
essayez de josh hull solution
OriginalL'auteur Peter Miehle
Si vous êtes sûr que chaque sous-chaînes sont de 3 caractères, vous pouvez essayer ce code, à condition que TABLE1 est une table où il y a au moins X lignes (X = 10 dans cet exemple):
Si la longueur de la chaˆ ıne ne sont pas la même chose que vous avez à appliquer
LOCATE
fonction pour trouver le séparateurOriginalL'auteur Otto
J'avais besoin d'utiliser l'instrument, substr, garniture, et sali avec localiser aussi bien.. mais instr, et substr sont tous pris en charge. Vous pouvez trouver un patron. J'ai dû passer par un varchar split avec " - " et nécessaires pour trouver la fin et revenir en arrière à partir de là.
OriginalL'auteur David Isser
Je sais que c'est vieux post.. mais la pensée suivantes peuvent aider les autres.
J'ai utilisé la méthode suivante pour diviser la chaîne donnée.
OriginalL'auteur Jai
Dans DB2
Garder d'extrapoler...profitez-en...
OriginalL'auteur Vikram Vedha
OriginalL'auteur Shavqat Ibrohimov