2013-04-03 28 views
0

我有一個包含[Work Phone](nvarchar)列的表。使用此數據庫的軟件允許用戶輸入任何字符,因此很多列包含諸如「555-555-5555分機1234鮑勃瓊斯」之類的內容。我唯一需要的是數字,我打算將Phone和Ext拆分爲獨立的列。運行一個功能和其他一些事情後,我只需要撥打電話和分機號碼。所有空格和字母已被刪除(例如55555555551234)。使用LEN()將值傳遞給RIGHT()

我試圖分裂這種方式,我首先要通過計算字段中的字符總數(在我的示例中爲),然後將該數字減少10(電話號碼中的字符總數(不包括國家代碼))。因爲擴展可能是我試圖使用LEN字符1-5之間的任何地方()由10

SELECT RIGHT([Table].[Column], LEN([Table].[Column]) -10) 
FROM [Table] 

得到這個計數,然後減少它,我得到的是「傳遞給RIGHT無效的長度參數功能。」

SELECT LEN([Table].[Column]) -10 
SELECT LEN('55555555551234') -10 

我得到的預期值4:

,因爲如果我這樣做,我不完全理解這個問題。

將此參數傳遞給RIGHT的正確方法是什麼,這樣我就可以得到我想要的東西(還是隻有一種完全更好的方法來做到這一點)?

+0

當傳遞給RIGHT函數的LEN([Table]。[Column])-10求值爲負數時,會出現錯誤消息。如果在此示例中列的長度等於或小於9,則會發生這種情況。 ( –

回答

2

表中的所有項目都大於或等於10?

SELECT RIGHT(55555555551234, LEN(55555555551234) -10) 
SELECT RIGHT(5555555555, LEN(5555555555) -10) 
SELECT RIGHT(55555555, LEN(55555555) -10) 

嘗試

SELECT CASE WHEN LEN([Table].[Column)]) > 10 
    THEN RIGHT([Table].[Column], LEN([Table].[Column]) - 10) 
    END 
    FROM [Table] 
+0

很好用。謝謝。=) –

+0

在'CASE'中加入一個ELSE'(就像David Welker的答案一樣),或者當LEN <= 10時結果爲NULL。 –

0

的錯誤發生,因爲減去10有時帶回負。你會想在它周圍放一個案例說明。

IE。

SELECT 
    RIGHT([TABLE].[Column], 
    CASE when LEN([TABLE].[Column])-10 >= 0 then 
     LEN([TABLE].  [Column])-10 
    ELSE LEN([TABLE].[Column]) 
    END) 
FROM [TABLE] 

當然,也有可以使用CASE其他方式,這只是表明你在那裏示數的例子)

0

根據字符串模式,您可以使用PARSENAME打破它

DECLARE @foo varchar(100) = '555-555-5555 Ext. 1234 Bob Jones'; 
SELECT @foo = REPLACE(REPLACE(REPLACE(@foo, 'Ext.', ' '), ' ', ''), ' ', '.'); 
SELECT 
    @foo, 
    PARSENAME(@foo, 1), 
    PARSENAME(@foo, 2), 
    PARSENAME(@foo, 3), 
    PARSENAME(@foo, 4) 

這取決於名稱部分是如何構建

0

你可以嘗試STUFF函數得到擴展:

SELECT STUFF('55555555551234',1,10,'') 

它也適用於較短的字符串。