2014-09-18 1 views
-1

Je ne suis pas sûr de savoir comment procéder, mais j'ai une chaîne de données. J'ai besoin d'isoler un nombre de la chaîne qui peut varier en longueur. La chaîne d'origine varie également en longueur. Laisse moi te donner un exemple. Voici un ensemble de la chaîne de données d'origine:SQL: Recherche de caractères de longueur dynamique dans une chaîne de données

:000000000:370765:P:000001359:::3SA70000SUPPL:3SA70000SUPPL: 
:000000000:715186816:P:000001996:::H1009671:H1009671: 

Pour ces deux exemples, je dois 3SA70000SUPPL de la première et de la seconde H1009671. Comment ferais-je cela en utilisant SQL? J'ai entendu dire que les déclarations de cas pourraient fonctionner, mais je ne vois pas comment. S'il vous plaît aider.

+0

peut vous expliquer en anglais quelle partie de la chaîne dont vous avez besoin. il est difficile de suggérer quoi que ce soit sur deux exemples sans connaître l'algorithme que vous avez utilisé pour isoler ces deux valeurs. – Bulat

+2

Quelle base de données utilisez-vous? Et comment savez-vous ce que vous voulez, juste le dernier élément délimité? –

+0

Il s'agit d'une base de données DB2. Ceux-ci ne sont pas réellement délimités. Ils semblent être délimités par deux points, mais ce n'est pas le cas. La chaîne d'origine est en fait un champ de table unique. Si je peux saisir la dernière entrée "délimitée" de deux points, cela fonctionnera. Une autre question ici est le champ de table a une longueur de 150 caractères. Fondamentalement, j'ai besoin de la 7ème ou 8ème entrée "délimitée" à partir du début de la chaîne, et cela devrait être statique, donc si je peux compter d'une manière ou d'une autre sur le 7ème ou 8ème deux-points, cela fonctionnerait. – Drauul

Répondre

0

première sous-chaîne devient la chaîne à ::: et deuxième sous-chaîne récupère la chaîne à partir de ::: à: declare @x varchar (1024) = »: 000000000: 715186816: P: 000001996 ::: H1009671: H1009671 : »

declare @temp varchar(1024)= SUBSTRING(@x,patindex('%:::%', @x)+3, len(@x)) 
SELECT SUBSTRING(@temp, 0,CHARINDEX(':', @temp, 0)) 
1

Cela fonctionne dans Oracle 11g:

with tbl as (
select ':000000000:370765:P:000001359:::3SA70000SUPPL:3SA70000SUPPL:' str from dual 
union 
select ':000000000:715186816:P:000001996:::H1009671:H1009671:' str from dual 
) 
select REGEXP_SUBSTR(str, '([^:]*)(:|$)', 1, 8, NULL, 1) data 
from tbl; 

enter image description here

qui peut être décrit comme « regarder l'occurrence 8 zéro ou plusieurs caractères non-deux-points suivis d'un deux-points ou de la fin de la ligne, et renvoient le 1er sous-groupe (qui est la donnée moins le signe deux-points ou la fin de la ligne).

De ce poste: REGEX to select nth value from a list, allowing for nulls

Désolé, juste vu que vous utilisez DB2. Je ne sais pas s'il existe une fonction d'expression régulière équivalente, mais peut-être que cela aidera encore.

Pour le plaisir: SQL Fiddle

Questions connexes