Nếu phần số luôn ở đầu thì bạn có thể sử dụng phần này:
PATINDEX('%[0-9][^0-9]%', ConcUnit)
để lấy chỉ mục của chữ số cuối cùng.
Vì vậy, điều này:
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
mang lại cho bạn:
Number Unit
-------------
4000 ug/ML
CHỈNH SỬA:
Nếu dữ liệu số cũng bao gồm các giá trị kép, thì bạn có thể sử dụng điều này:
SELECT LEN(@str) - PATINDEX ('%[^0-9][0-9]%', REVERSE(@str))
để lấy chỉ mục của chữ số cuối cùng .
Vì vậy, điều này:
SELECT LEFT(@str, LEN(@str) - PATINDEX ('%[^0-9][0-9]%', REVERSE(@str)))
cung cấp cho bạn phần số.
Và đây:
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
cung cấp cho bạn cả phần số và phần đơn vị.
Dưới đây là một số thử nghiệm mà tôi đã thực hiện với dữ liệu bạn đã đăng:
Đầu vào:
DECLARE @str VARCHAR(MAX) = '50 000ug/ML'
Đầu ra:
Numeric Unit
------------
50 000 ug/ML
Đầu vào:
DECLARE @str VARCHAR(MAX) = '99.5%'
Đầu ra:
Numeric Unit
------------
99.5
Đầu vào:
DECLARE @str VARCHAR(MAX) = '4000 . 35 % ug/ML'
Đầu ra:
Numeric Unit
------------------
4000 . 35 ug/ML