Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

dividir alfa e numérico usando sql


Se a parte numérica estiver sempre no início, você poderá usar isso:
PATINDEX('%[0-9][^0-9]%', ConcUnit)

para obter o índice do último dígito.

Assim, este:
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

da-te:
Number  Unit
-------------
4000    ug/ML

EDITAR:

Se os dados numéricos também incluírem valores duplos, você poderá usar isto:
SELECT LEN(@str) - PATINDEX ('%[^0-9][0-9]%', REVERSE(@str))

para obter o índice do último dígito .

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

dá-lhe a parte numérica.

E isto:
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

fornece a parte numérica e unitária.

Aqui estão alguns testes que fiz com os dados que você postou:

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

Saída:
Numeric Unit
------------
50 000  ug/ML

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

Saída:
Numeric Unit
------------
99.5    

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

Saída:
Numeric     Unit
------------------
4000 . 35   ug/ML