使用sql拆分alpha和数字

Wae*_*lhi 7 sql-server split sql-server-2005

我有一张桌子,它有3列.的first column是包含值(数字)和单元中的数据(百分比和等.),第2栏是numeric column,第三是Unit column.我想要做的是从第一列拆分数字和单位,然后将这些拆分数据放到指定的列.

这是我的表:

更新的图像

我试过这个函数:SO链接在这里......,它确实拆分了alpha和数字然后我是新的使用SQL函数,我的问题是参数必须是字符串STRING,所以我做的是将它改为Sub查询,但它给我错误.

样品编号:

SQL功能:

create function [dbo].[GetNumbersFromText](@String varchar(2000))
returns table as return
(
  with C as
  (
    select cast(substring(S.Value, S1.Pos, S2.L) as int) as Number,
           stuff(s.Value, 1, S1.Pos + S2.L, '') as Value
    from (select @String+' ') as S(Value)
      cross apply (select patindex('%[0-9]%', S.Value)) as S1(Pos)
      cross apply (select patindex('%[^0-9]%', stuff(S.Value, 1, S1.Pos, ''))) as S2(L)
    union all
    select cast(substring(S.Value, S1.Pos, S2.L) as int),
           stuff(S.Value, 1, S1.Pos + S2.L, '')
    from C as S
      cross apply (select patindex('%[0-9]%', S.Value)) as S1(Pos)
      cross apply (select patindex('%[^0-9]%', stuff(S.Value, 1, S1.Pos, ''))) as S2(L)
    where patindex('%[0-9]%', S.Value) > 0
  )
  select Number
  from C
)
Run Code Online (Sandbox Code Playgroud)

使用SUB查询选择语句:

declare @S varchar(max)
select number from GetNumbersFromText(Select SomeColm From Table_Name) option (maxrecursion 0)
Run Code Online (Sandbox Code Playgroud)

顺便说一下,即时通讯使用sql server 2005.

谢谢!

Gio*_*sos 11

如果数字部分始终在开头,那么您可以使用:

PATINDEX('%[0-9][^0-9]%', ConcUnit)
Run Code Online (Sandbox Code Playgroud)

获取最后一位数的索引.

因此,这个:

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
Run Code Online (Sandbox Code Playgroud)

给你:

Number  Unit
-------------
4000    ug/ML
Run Code Online (Sandbox Code Playgroud)

编辑:

如果数字数据也包含double值,那么您可以使用:

SELECT LEN(@str) - PATINDEX ('%[^0-9][0-9]%', REVERSE(@str))
Run Code Online (Sandbox Code Playgroud)

获取最后一位数的索引.

因此,这个:

SELECT LEFT(@str, LEN(@str) - PATINDEX ('%[^0-9][0-9]%', REVERSE(@str)))
Run Code Online (Sandbox Code Playgroud)

给你数字部分.

还有这个:

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
Run Code Online (Sandbox Code Playgroud)

给你数字和单位部分.

以下是我对您发布的数据进行的一些测试:

输入:

DECLARE @str VARCHAR(MAX) = '50 000ug/ML'
Run Code Online (Sandbox Code Playgroud)

输出:

Numeric Unit
------------
50 000  ug/ML
Run Code Online (Sandbox Code Playgroud)

输入:

DECLARE @str VARCHAR(MAX) = '99.5%'
Run Code Online (Sandbox Code Playgroud)

输出:

Numeric Unit
------------
99.5    
Run Code Online (Sandbox Code Playgroud)

输入:

DECLARE @str VARCHAR(MAX) = '4000 . 35 % ug/ML'
Run Code Online (Sandbox Code Playgroud)

输出:

Numeric     Unit
------------------
4000 . 35   ug/ML
Run Code Online (Sandbox Code Playgroud)