1
votes

SQL Récupère la chaîne entre le deuxième et le troisième trait de soulignement

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.

sql

2 commentaires

Pouvez-vous partager votre exemple de code?


Quels dbms utilisez-vous? (De nombreux produits ont leurs propres fonctions de chaîne ...)


3 Réponses :


1
votes

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)


0 commentaires

1
votes

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;


0 commentaires

1
votes

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>


0 commentaires