2015-02-06 80 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