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?
5 Réponses :
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)
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);
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 () .
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.
Voici une doublure pour vous
select right('m_johnson_1234', charindex('_', reverse('m_johnson_1234') + '_') - 1)
SET numéro = sélectionner à droite ('m_johnson_1234', charindex ('', reverse ('m_johnson_1234') + '') - 1)
Réponse tardive, et simplement parce que je n'ai pas vu PARSENAME () mentionné.
Exemple
Select parsename(replace(t2.code,'_','.'),1) From YourTable