2010-09-22 3 views
2

Ma base de données contient les chaînes suivantes ainsi que d'autres qui sont similairesSQL Reprenant une chaîne avec deux espaces dans une ligne dans une clause LIKE

Old Type: New Type: IRP User: dls0835 
Old Type: BASE PLATE New Type: IRP User: ter2344 

J'essaie de ne pas renvoyer le premier type de chaîne mais encore retourne le deuxième type de chaîne.

Notez qu'il n'y a pas de texte après le "Old Type:" dans la première chaîne et qu'il y a en fait 2 espaces entre celui-ci et le mot "New Type".

Dans la deuxième chaîne, il y a du texte après "Ancien type:" mais ce texte change en fonction de ce que l'utilisateur choisit.

De plus, le "Nouveau type" et "Utilisateur" peuvent également changer.

J'essaie de ne retourner aucun des enregistrements où le "Ancien type:" n'a aucun texte après lui.

J'ai essayé les éléments suivants:

n.[text] NOT LIKE 'Old Type: New Type: %' 

Cela renvoie encore les vides pour une raison quelconque. Je pense qu'il peut être dû à deux espaces entre Old Type et New Type lorsque Old Type est vide ????

Merci!

+0

je recommande de décomposer les données jusqu'à en colonnes, de cette façon vous peut effectivement filtrer correctement. – DForck42

Répondre

2

Essayez ceci:

where patindex('%New Type:%', n.text) > 12 
+0

Cela fonctionne! merci – user380432

+0

@ user380432 En combinant 'patindex' et' substring' vous pouvez réellement extraire les parties nécessaires pour une analyse et un filtrage plus poussés. –

0

Ma suggestion initiale est de modifier la disposition de votre table pour faciliter la tâche. Parfois, changer votre angle d'approche est la solution la plus simple.

+0

Je n'ai pas d'autre choix que de l'utiliser de cette façon. – user380432

+0

Compris, bien que ça craint pour un manque d'un meilleur mot. –

2

Que diriez-vous:

WHERE CHARINDEX('Old Type: New Type:', n.[text]) = 0 
+0

Cela retourne encore les dossiers que je ne veux pas: Ancien Type: Nouveau Type: BASE PLATE User: rje234 – user380432

0

est ici un exemple de ce que je ferais

declare @table table (String varchar(max)) 

insert into @table values ('Old Type: New Type: IRP User: dls0835 ') 
insert into @table values ('Old Type: BASE PLATE New Type: IRP User: tdl2921 ') 


;with cte as 
(
select 
    SUBSTRING(string,CHARINDEX('Old Type: ',String)+10,CHARINDEX('New Type: ',String)-(CHARINDEX('Old Type: ',String)+10)) as OldType, 
    SUBSTRING(string,CHARINDEX('New Type: ',String)+10,CHARINDEX('IRP User: ',String)-(CHARINDEX('New Type: ',String)+10)) as NewType, 
    right(string,len(string)-(CHARINDEX('IRP User: ',string)+8)) as IRPUser 
from @table 
) 
select 
* 
from cte 
where OldType<>'' 
Questions connexes