2009-12-10 8 views
1

je la requête suivante:Substring SQL en utilisant deux problèmes charindexes

DECLARE @str VARCHAR(500) 
SET @str = 'Barcode: 22037 CaseSize: 1 Qty: 3' 

SELECT RTRIM(LTRIM(
     SUBSTRING(@str, CharIndex('CaseSize: ', @str) + 10, CHARINDEX('Qty:', @str)) 
     )) 

Les résultats suivants: « 1 Quantité: 3 »

Je voudrais être en mesure de sélectionner uniquement le nombre Taille de cas , qui est un dans ce cas.

Quelle est la méthode la plus simple pour accomplir cette tâche? Un collègue a résolu le problème en créant un début et variable fin, puis de les utiliser dans la sous-chaîne:

Declare @start INT , @end INT 
SET @start = CharIndex('CaseSize: ', @str) + 10 
SET @end = CHARINDEX('Qty:', @str) 

SELECT CONVERT(INT, LTRIM(RTRIM(SUBSTRING(@str, @start, @end - @start)))) 

Depuis que je fais cela dans une instruction select, quelle serait la meilleure façon? C'EST À DIRE. Pourquoi mon instruction select ci-dessus échoue?

+2

Vous devriez probablement utiliser les colonnes 'Barcode', 'CaseSize' et 'Qty' au lieu de stocker ces informations dans une chaîne. –

+0

Très vrai. Cependant, je ne suis qu'un inhérent de ce schéma de données. – user99143

Répondre

3

Le problème est que la sous-chaîne (au moins dans MSSQL et apparemment MySQL) prend la longueur de la sous-chaîne comme troisième argument, pas l'index de fin. L'exemple de votre collègue fonctionne parce qu'il fait @end - @start qui renvoie la longueur que vous voulez.

Votre exemple serait correctement si modifié pour être:

DECLARE @str VARCHAR(500) 
SET @str = 'Barcode: 22037 CaseSize: 1 Qty: 3' 
SELECT RTRIM(LTRIM(SUBSTRING(@str, 
          CharIndex('CaseSize: ', @str) + 10, 
          (CHARINDEX('Qty:', @str)-(CharIndex('CaseSize: ', @str) + 10))))) 

http://msdn.microsoft.com/en-us/library/ms187748.aspx?ppud=4 http://dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_substring

1

SUBSTRING prend un début et une longueur, pas un début et une fin. Votre déclaration ci-dessus ne contient pas le - @end que votre collègue avait.