2014-02-13 48 views
-1

我有列名SQL查詢來fillter和更新表

中,我們有這樣的員工的名稱的名稱字段

僱員數據庫表 - > LI-MING(ALLEN)

這是有真正的名字和()

有英文暱稱我想知道如果我能在一個SQL UPDATE查詢

各地交換這樣的:LI-MING(阿倫)TO:ALLEN(LI-MING )

我之所以想這樣做的原因是用戶希望讓它按暱稱排序此列

+0

那麼通過選擇括號內的子字符串來構建一個新的NAME字段呢?我從來沒有使用sql-server,但這看起來像一個很好的起點:http://technet.microsoft.com/en-us/library/ms186323.aspx –

+0

你可以按照暱稱對它進行排序,而不用交換它:build正則表達式返回的暱稱和順序。 - 另外,您的情況表明您寧願將英文名稱存儲在單獨的列中,而不是放在括號中。 –

回答

1

試試這個

UPDATE Employee 
    SET NAME = 
     SUBSTRING(name,CHARINDEX('(',name)+1,(CHARINDEX(')',name)-CHARINDEX('(',name)-1))+ 
     ' ('+SUBSTRING(name,1,CHARINDEX('(',name)-1)+')' 
FROM Employee 
0

如果我是你,我會爲名稱和暱稱創建單獨的列。試圖快速獲取字符串部分可以防止sql server使用可能真正導入並從性能角度來看的索引。

所以有basicly兩種選擇:

  1. 爲單獨列解析值每次更新或插入一個新員工(通過觸發器,應用程序代碼等)的時間。
  2. 或者只是創建兩個計算列,但確保它們被標記爲持久。

希望它有幫助!

0

我曾在幾個項目的工作,我已經做到了我的方式來更新同樣的問題,你在3個步驟,通過了:

1)ID或名稱創建表字段並將值插入表格

2)修剪具有不同功能的值,並將最終值插入到不同的表中。

3)更新與新價值

我不說這是做事情的唯一途徑,但可能還有其他的方式,以及舊錶。

Create table #Employee(
EmployeeName varchar(200) 
) 

Insert into #Employee 
Select 'LI-MING (ALLEN)' union all 
Select 'Jio-Kio (Smith)' 


Select 
substring(employeename,1,patindex('%(%',employeename)-1), 
--Len(substring(employeename,1,patindex('%(%',employeename)-1)), 
Right(employeename,len(employeename)-(len(substring(employeename,1,patindex('%(%',employeename))))) 

from #Employee 

Create table #EmployeeNew(
Employeename1 varchar(200), 
Employeename2 varchar(200) 
) 

Insert into #EmployeeNew(Employeename1, Employeename2) 

Select 
ltrim(rtrim(substring(employeename,1,patindex('%(%',employeename)-1))), 
ltrim(rtrim(Right(Employeename,charindex('(',employeename,1)-3))) 
from #Employee 

Select * from #Employee 
Select * from #EmployeeNew 
Select cast('('+Employeename1+')'+left(employeename2,len(employeename2)-1) as varchar(200)) from #EmployeeNew 

Update e 
Set e.EmployeeName = cast('('+e1.Employeename1+')'+left(e1.employeename2,len(e1.employeename2)-1) as varchar(200)) 
from #Employee e 
left outer join #EmployeeNew e1 on ltrim(rtrim(substring(e.employeename,1,patindex('%(%',e.employeename)-1))) =e1.Employeename1