Sql 从字符串中提取大小(数字)

Sql 从字符串中提取大小(数字),sql,sql-server,string,tsql,string-parsing,Sql,Sql Server,String,Tsql,String Parsing,我在表中有一列,其值存储为 HX CAP SCR GD5 1/2-13 X 3 3/4 HX CAP SCR GD8 1/2-13 X 4 1/4 HX CAP SCR Grade 5 1/2-13 X 5 1/2 HX CAP SCR Grade 8 1/2-13 X 6 1/2 现在,我需要将这些值存储到另一个表中,如 CATEGORY SIZE HX CAP SCR GD5 1/2-13 X 3 3/4 HX CAP SCR GD8

我在表中有一列,其值存储为

HX CAP SCR GD5 1/2-13 X 3 3/4
HX CAP SCR GD8 1/2-13 X 4 1/4 
HX CAP SCR Grade 5 1/2-13 X 5 1/2
HX CAP SCR Grade 8 1/2-13 X 6 1/2
现在,我需要将这些值存储到另一个表中,如

CATEGORY               SIZE
HX CAP SCR GD5         1/2-13 X 3 3/4
HX CAP SCR GD8         1/2-13 X 4 1/4
HX CAP SCR Grade 5     1/2-13 X 5 1/2
HX CAP SCR Grade 8     1/2-13 X 6 1/2
我需要将类别与大小值分开

This is what I have so far, but it is not working the GD5 and GR8 are part of the category column.

SELECT  CustDesc
        ,'??????' as Category
        ,SUBSTRING(CustDesc,PatIndex('%[0-9.-]%', CustDesc),8000) as Size   
FROM [##CustParts]
以上查询的结果

CustDesc                    Category    Size
HX CAP SCR GD5 1/2-13 X 3   ??????          5 1/2-13 X 3 

请让我知道查询是如何执行此操作的……

根据您的示例,数字1似乎是您解析每个元组中的值的引用。研究tsql的sqlcharindex命令-查找文本在字符串中的位置


还有更多的值需要解析吗?请提供更好的待解析数据横截面。-thx

你需要制定一个看似合理的规则。例如,它看起来像是在“X”之前的第一个空格之后开始的大小。我们可以使用SQL Server中的(原语)字符串函数来实现这一点:

select ltrim(rtrim(left(val, pos1 - spacebefore))) as product,
     substring(val, pos1 - spacebefore + 1, 1000) as size
from (select t.*, charindex(' ', reverse(left(val, pos1-1))) as spacebefore
      from (select t.*,
                   charindex(' X ', val) as pos1
            from (select 'abce 15/3 x 2' as val) t
           ) t
     ) t

您好,如果您的字符串始终包含字符“1/2”,那么这将非常有效

CREATE TABLE #tbl(col1 varchar(200))

INSERT INTO #tbl 
VALUES('HX CAP SCR GD5 1/2-13 X 3 3/4'),
('HX CAP SCR GD8 1/2-13 X 4 1/4'),
('HX CAP SCR Grade 5 1/2-13 X 5 1/2'),
('HX CAP SCR Grade 8 1/2-13 X 6 1/2')

select Left(col1,CHARINDEX('1/2',col1,1)-1),RIGHT(col1,len(col1)-(CHARINDEX('1/2',col1,1)-1)) from #tbl

请提供一个更好的例子来说明你的意思。源表中的行示例是什么?您希望如何将其存储在第二个表中?似乎可以在脚本中完成,并在解析字符串后插入。请尝试使用SUBSTRING()和CHARINDEX()或POSITION()函数,看看你是怎么做的。你怎么知道5和8是第一个字符串的一部分,而不是大小的一部分?所有大小的字符数是否完全相同(看起来像10)?你为什么不把它们分开存放呢?直径不同。这将不起作用,因为这只是我从200k列表中选择的一项。