Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

diviser alpha et numérique en utilisant sql

Si la partie numérique est toujours au début, alors vous pouvez utiliser ceci :

PATINDEX('%[0-9][^0-9]%', ConcUnit)

pour obtenir l'indice du dernier chiffre.

Ainsi, ceci :

DECLARE @str VARCHAR(MAX) = '4000 ug/ML' 

SELECT LEFT(@str, PATINDEX('%[0-9][^0-9]%', @str )) AS Number,
       LTRIM(RIGHT(@str, LEN(@str) - PATINDEX('%[0-9][^0-9]%', @str ))) As Unit

vous donne :

Number  Unit
-------------
4000    ug/ML

MODIF :

Si les données numériques incluent également des valeurs doubles, vous pouvez utiliser ceci :

SELECT LEN(@str) - PATINDEX ('%[^0-9][0-9]%', REVERSE(@str))

pour obtenir l'indice du dernier chiffre .

Ainsi, ceci :

SELECT LEFT(@str, LEN(@str) - PATINDEX ('%[^0-9][0-9]%', REVERSE(@str)))

vous donne la partie numérique.

Et ceci :

SELECT LEFT(@str, LEN(@str) - PATINDEX ('%[^0-9][0-9]%', REVERSE(@str))) AS Numeric,
       CASE 
          WHEN CHARINDEX ('%', @str) <> 0 THEN LTRIM(RIGHT(@str, LEN(@str) - CHARINDEX ('%', @str)))
          ELSE LTRIM(RIGHT(@str, PATINDEX ('%[^0-9][0-9]%', REVERSE(@str))))
       END AS Unit

vous donne à la fois la partie numérique et la partie unitaire.

Voici quelques tests que j'ai faits avec les données que vous avez postées :

Entrée :

DECLARE @str VARCHAR(MAX) = '50 000ug/ML'

Sortie :

Numeric Unit
------------
50 000  ug/ML

Entrée :

DECLARE @str VARCHAR(MAX) = '99.5%'

Sortie :

Numeric Unit
------------
99.5    

Entrée :

DECLARE @str VARCHAR(MAX) = '4000 . 35 % ug/ML'

Sortie :

Numeric     Unit
------------------
4000 . 35   ug/ML