1
votes

Obtenir du texte après la deuxième occurrence d'un caractère spécifique

J'ai une colonne avec des données comme celle-ci:

SET number = substring(t2.code, charindex('_', t2.code, 2) + 1, len(t2.code))  

Par exemple:

surname_numericCode

J'ai besoin d'extraire le code numérique. J'ai essayé avec la fonction SUBSTRING mais j'obtiens juste:

m_johnson_1234

Voici le code que j'ai utilisé:

firstNameLetter_surname_numericCode

Comment puis-je obtenir uniquement le code numérique?


0 commentaires

5 Réponses :


1
votes

Appelez la fonction CHARINDEX deux fois:

SELECT SUBSTRING(
           code,
           NULLIF(CHARINDEX('_', code, NULLIF(CHARINDEX('_', code), 0) + 1), 0) + 1,
           LEN(code)
       )
FROM (VALUES
    ('a_b_c'),
    ('a_b')
) x(code)


0 commentaires

1
votes

Une méthode consiste à rechercher le premier _ dans la chaîne inversée:

select col,
       stuff(col, 1, patindex('%[_][0-9]%', col), '') as numericCode
from (values ('firstNameLetter_surname_0000')) v(col);

Si le code numérique est vraiment un nombre - et qu'aucun autre nombre ne commence les valeurs précédentes - alors vous pouvez utiliser patindex():

select col,
       stuff(col, 1, len(col) - charindex('_', reverse(col)) + 1, '') as numericCode
from (values ('firstNameLetter_surname_numericCode')) v(col);


0 commentaires

0
votes

Les fonctions SUBSTR et INSTR peuvent être combinées pour obtenir le code numérique.

SELECT SUBSTR('m_johnson_1234', INSTR('m_johnson_1234', '_', 1, 2)+1) FROM TABLE; 

Pour l'argument start_pos, utilisez INSTR pour commencer au début de la chaîne et recherchez l'index de la deuxième instance du caractère '_'. Ensuite, utilisez-le pour commencer une position après et lire jusqu'à la fin de la chaîne.

Si vous avez besoin que le résultat soit numérique au lieu d'une chaîne, encapsulez SUBSTR () dans une fonction TO_NUMBER () .


2 commentaires

Je crois qu'il n'y a pas de fonction INSTR dans sql-server. C'est CHARINDEX à la place. Voici la démonstration de la proposition de solution ainsi que la preuve que l'instr ne fonctionne pas: dbfiddle.uk/ …


Vous avez raison, je n'ai pas lu cette balise. Cette solution fonctionnerait sur un exemple Oracle SQL, mais pas sur un serveur SQL.



1
votes

Voici une doublure pour vous

   select right('m_johnson_1234', charindex('_', reverse('m_johnson_1234') + '_') - 1)


1 commentaires

SET numéro = sélectionner à droite ('m_johnson_1234', charindex ('', reverse ('m_johnson_1234') + '') - 1)



1
votes

Réponse tardive, et simplement parce que je n'ai pas vu PARSENAME () mentionné.

Exemple

Select parsename(replace(t2.code,'_','.'),1)
 From  YourTable


0 commentaires