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

opdele alfa og numerisk ved hjælp af sql

Hvis den numeriske del altid er i begyndelsen, kan du bruge denne:

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

for at få indekset for det sidste ciffer.

Altså dette:

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

giver dig:

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

EDIT:

Hvis numeriske data også inkluderer dobbelte værdier, kan du bruge dette:

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

for at få indekset for det sidste ciffer .

Altså dette:

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

giver dig den numeriske del.

Og dette:

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

giver dig både nummerisk og enhedsdel.

Her er nogle tests, som jeg har lavet med de data, du har indsendt:

Indtastning:

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

Output:

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

Indtastning:

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

Output:

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

Indtastning:

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

Output:

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


  1. Betyder rækkefølgen af ​​tabeller i en joinforbindelse, når LEFT (ydre) joins bruges?

  2. Oprettelse og implementering af flere versioner af databasen gennem skemasnapshots

  3. SQL-kommandoer snydeark – Sådan lærer du SQL på 10 minutter

  4. BDE vs ADO i Delphi