sql >> Databasteknik >  >> RDS >> Sqlserver

dela alfa och numerisk med sql

Om den numeriska delen alltid är i början kan du använda detta:

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

för att få indexet för den sista siffran.

Alltså detta:

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

ger dig:

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

EDIT:

Om numeriska data också innehåller dubbla värden kan du använda detta:

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

för att få index för den sista siffran .

Alltså detta:

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

ger dig den numeriska delen.

Och det här:

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

ger dig både nummer- och enhetsdel.

Här är några tester som jag gjorde med den information du har lagt upp:

Inmatning:

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

Utdata:

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

Inmatning:

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

Utdata:

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

Inmatning:

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

Utdata:

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


  1. MySQL RADIANS() Funktion – Konvertera från grader till radianer

  2. Generera slumpmässiga heltal utan kollisioner

  3. Oracle-anslutningssträng utan tnsnames.ora-fil

  4. Bulk Infoga till Oracle med .NET