2014-09-26 57 views
-1

我在我的數據庫中有一列存儲標題,名字和姓氏。但是這個列中的數據有時並不乾淨,客戶的標題缺失或爲空,其他時候名字不可用,而在其他時間,姓氏無效。現在,我想要將列分隔或拆分爲三個 - 標題,名字,姓氏,記住我必須檢查空值或空數據。如何清理這個數據讓喜歡錯誤:不返回SUBSTRING和CHARINDEX分隔列中的值

Msg 536, Level 16, State 2, Line 1 
Invalid length parameter passed to the RIGHT function. 

Msg 537, Level 16, State 2, Line 1 
Invalid length parameter passed to the LEFT or SUBSTRING function. 

我寫了這樣的腳本,但不夠好。

SELECT FullName 
    , LEFT(FullName, ISNULL(NULLIF(CHARINDEX(' ', FullName) - 1, -1), LEN(FullName))) AS Title 
    , RIGHT(Salute, LEN(Salute) - CHARINDEX(' ', FullName, 1)) FirstName 
    , SUBSTRING(FullName, 1, CHARINDEX(' ', FullName, 19) - 1) LastName 
FROM Details 

如果我們有一個標題和一個名字,我們應該分成Title,FirstName。如果沒有標題,我們會將其視爲姓名和姓氏 謝謝。

+0

空數據不能存在於字符串中。那麼一些數據看起來像什麼代表你的每個案例。你在這裏的模式匹配水平之後。如果Title和firstName缺失,你怎麼知道這是姓氏而不是名字?它是否被一個像COMMA這樣的值分開了?所以它可能看起來像,史密斯先生或史密斯先生,或者你可以有史密斯先生,在這種情況下,我不知道史密斯是最後名字還是名字? – xQbert 2014-09-26 15:25:21

+0

沒有COMMA或類似的東西。數據不帶分隔符輸入。 – dLight 2014-09-26 15:32:15

+0

所以你用空格來表示分離,然後假設名字或標題不像Jake II或John Paul Jones先生那樣複雜。 – xQbert 2014-09-26 15:35:07

回答

1

不是我最好的作品,但近看:

http://sqlfiddle.com/#!3/f87e8/18/0根據註釋中標識的規則似乎工作。如果規則發生變化,應該是在案例中移動現有代碼以滿足需求。

Select FullName, 
CASE len(fullname) - len(replace(fullName,' ','')) 
WHEN 2 then 
    LEFT(FULLNAME,charIndex(' ',FULLNAME)) 
WHEN 1 then 
    '' 
when 0 then 
    '' 
end as Title, 

CASE len(fullname) - len(replace(fullName,' ','')) 
WHEN 2 then 
    REPLACE(REPLACE(FULLNAME,LEFT(FULLNAME,charIndex(' ',FULLNAME)),''),REVERSE(LEFT(REVERSE(FULLNAME),CHARINDEX(' ', REVERSE(FullName)))),'') 
WHEN 1 then 
    LEFT(FULLNAME,CHARINDEX(' ', FullName)) 
when 0 then 
    '' 
end as First, 

CASE len(fullname) - len(replace(fullName,' ','')) 
WHEN 2 then 
     REVERSE(LEFT(REVERSE(FULLNAME),CHARINDEX(' ', REVERSE(FullName)))) 
When 1 then 
     REVERSE(LEFT(REVERSE(FULLNAME),CHARINDEX(' ', REVERSE(FullName)))) 
WHEN 0 then 
     FullName 
end as LAST 
from foo 
+0

美麗!這工作得很好。謝謝xQbert – dLight 2014-09-29 08:29:59

0

採取在這個

RIGHT(Salute, LEN(Salute) - CHARINDEX(' ', FullName, 1)) FirstName 

你能看到如何

CHARINDEX(' ', FullName, 1)

可能是超出範圍的禮炮

set nocount on;   
declare @fullname char(200) = 'jonnywalker whiskey  '; 
declare @left int; 
set @left = (select ISNULL(NULLIF(CHARINDEX(' ', @fullname) - 1, -1), LEN(@fullname))); 
select @left; 
select LEFT(@fullname, @left) AS Title 

declare @salute char(200) = 'salute  '; 
declare @right int; 
set @right = (select (LEN(@salute) - CHARINDEX(' ', @fullname, 1))); 
select @right; 
select RIGHT(@salute, @right) FirstName; 
+0

謝謝。但上述查詢給出了一個錯誤: 消息536,級別16,狀態2,行23 傳遞給RIGHT函數的長度參數無效。 – dLight 2014-09-29 08:22:18

+0

@dLight確實如此。它會告訴你錯誤在哪裏。你看不到你能否看到CHARINDEX('',FullName,1)可能超出Salute的範圍? – Paparazzi 2014-09-29 12:48:32