Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

dividere alfa e numerico usando sql

Se la parte numerica è sempre all'inizio, puoi usare questo:

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

per ottenere l'indice dell'ultima cifra.

Quindi, questo:

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

ti dà:

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

MODIFICA:

Se i dati numerici includono anche valori doppi, puoi utilizzare questo:

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

per ottenere l'indice dell'ultima cifra .

Quindi, questo:

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

ti dà la parte numerica.

E questo:

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

ti dà sia la parte numerica che quella unitaria.

Ecco alcuni test che ho fatto con i dati che hai postato:

Inserimento:

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

Uscita:

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

Inserimento:

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

Uscita:

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

Inserimento:

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

Uscita:

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