Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Teilen Sie Alpha und Numerisch mit SQL auf

Wenn der numerische Teil immer am Anfang steht, dann kannst du das verwenden:

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

um den Index der letzten Ziffer zu erhalten.

Also das hier:

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

gibt Ihnen:

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

BEARBEITEN:

Wenn numerische Daten auch Double-Werte enthalten, können Sie Folgendes verwenden:

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

um den Index der letzten Ziffer zu erhalten .

Also das hier:

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

gibt Ihnen den numerischen Teil.

Und das:

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

gibt Ihnen sowohl Zahlen- als auch Einheitenteile.

Hier sind einige Tests, die ich mit den von Ihnen geposteten Daten durchgeführt habe:

Eingabe:

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

Ausgabe:

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

Eingabe:

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

Ausgabe:

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

Eingabe:

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

Ausgabe:

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