J'ai besoin d'extraire une certaine chaîne d'une colonne dans une table dans le cadre d'un package SSIS.
Le contenu de la colonne est formaté comme ceci "TST_AB1_ABC123456_TEST".
J'ai besoin d'obtenir la chaîne entre le deuxième et le troisième "_", par exemple "ABC123456" sans trop changer le paquet, alors je préfère le faire en 1 commande SQL si possible.
J'ai essayé plusieurs méthodes différentes en utilisant SUBSTRING, REVERSE et CHARINDEX mais je n'arrive pas à trouver comment obtenir uniquement cette chaîne.
3 Réponses :
Si les valeurs de vos colonnes comportent toujours 4 parties, vous pouvez utiliser PARSENAME () fonctionne comme ceci.
DECLARE @MyString VARCHAR(100) SET @MyString = 'TST_AB1_ABC123456_TEST'; SELECT PARSENAME(REPLACE(@MyString, '_', '.'), 2)
Utilisation des fonctions de chaîne de base:
SELECT
SUBSTRING(<your column>,
<starting at one past the second underscore>,
<for a length of the number of characters in between the 2nd and 3rd
underscore>)
FROM yourTable;
Dans le format notes, l'appel ci-dessus à SUBSTRING dit:
SELECT
SUBSTRING(col,
CHARINDEX('_', col, CHARINDEX('_', col) + 1) + 1,
CHARINDEX('_', col, CHARINDEX('_', col, CHARINDEX('_', col) + 1) + 1) -
CHARINDEX('_', col, CHARINDEX('_', col) + 1) - 1)
FROM yourTable;
Vous pouvez également le faire en utilisant Cross Apply . J'ai ajouté une clause where pour m'assurer que vous n'obtenez pas d'erreur résultant de chaînes sans 3 traits de soulignement
+------------------------+-----------+ | txt1 | txt2 | +------------------------+-----------+ | TST_AB1_ABC123456_TEST | ABC123456 | +------------------------+-----------+
Sorties p>
with your_table as (select 'TST_AB1_ABC123456_TEST' as txt1) select txt1, txt2 from your_table t1 where txt1 like '%_%_%_%' cross apply (select charindex( '_', txt1) as i1) t2 -- locate the 1st underscore cross apply (select charindex( '_', txt1, (i1 + 1)) as i2 ) t3 -- then the 2nd cross apply (select charindex( '_', txt1, (i2 + 1)) as i3 ) t4 -- then the 3rd cross apply (select substring( txt1,(i2+1), (i3-i2-1)) as txt2) t5 -- between 2nd & 3rd
DEMO fort>
Pouvez-vous partager votre exemple de code?
Quels dbms utilisez-vous? (De nombreux produits ont leurs propres fonctions de chaîne ...)