sql >> Database >  >> RDS >> Sqlserver

alfa en numeriek splitsen met sql

Als het numerieke gedeelte altijd aan het begin staat, dan kun je dit gebruiken:

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

om de index van het laatste cijfer te krijgen.

Dus dit:

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

geeft je:

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

BEWERKEN:

Als numerieke gegevens ook dubbele waarden bevatten, kunt u dit gebruiken:

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

om de index van het laatste cijfer te krijgen .

Dus dit:

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

geeft u het numerieke gedeelte.

En dit:

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

geeft u zowel numeriek als eenheidsdeel.

Hier zijn enkele tests die ik heb gedaan met de gegevens die je hebt gepost:

Invoer:

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

Uitgang:

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

Invoer:

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

Uitgang:

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

Invoer:

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

Uitgang:

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


  1. Kan een MySQL-trigger een CHECK-beperking simuleren?

  2. een betere aanpak dan het opslaan van mysql-wachtwoord in platte tekst in het configuratiebestand?

  3. Tabel maken in procedure

  4. Beschermt mysql_real_escape_string() VOLLEDIG tegen SQL-injectie?