2015-02-06 44 views
0

我有以下情形。该VARCHAR场只能有2个值1:SQL - 从VARCHAR字段计数INT

'12345 - some random text' 
'87654321 - some random text' 

我想要做的选择只有INT值,并使用这下面的查询,我几乎有,但我缺少一个关键组成部分:

SELECT 
    CASE 
    WHEN (ColumnName LIKE '%[0-9][0-9][0-9][0-9][0-9]%') 
      then SUBSTRING(ColumnName ,0 ,CHARINDEX('',ColumnName)+6) 
    WHEN (ColumnName LIKE '%[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]%') 
      then SUBSTRING(ColumnName ,0 ,CHARINDEX('',ColumnName)+9) 
    ELSE (NULL) END 
FROM dbo.TableName 

实际结果:

12345 
87654 

预期结果:

12345 
87654321 

请任何人都可以指出我失踪的一件简单的事情吗?

+0

不要留到第一个空格字符,把结果为整数。 – jarlh 2015-02-06 15:58:17

+0

或者,只需切换项目顺序,像第一个那样最长... – jarlh 2015-02-06 15:59:25

+0

考虑重构架构。如果这种事情(两个数据字段打包到一个字段中)经常需要分离,请将它们分成两个单独的字段。在需要时连接两个字段比在复合字段中搜索分隔符更容易和快得多。这两个字段的方法是可直接索引的,单个字段不是。 – wallyk 2015-02-06 16:02:57

回答

2

如果你想获取领先的整数值,您可以搜索的空间,并在此之前,采取一切:

select left(ColumnName, charindex(' ', ColumnName) - 1) 

您可以使用cast()这个转换为整数,如果你喜欢。

根据您的问题描述,该字段总是以整数后跟一个空格开头。如果某些值不是这种情况,那么您将需要使用case来验证格式。

而你没有得到你想要的东西的原因。条件顺序错误。较长的整数与第一个条件匹配,并在此处停止。

1

只需

SELECT 
    CAST(SUBSTRING_INDEX((ColumnName , '-', 1)) 
FROM dbo.TableName