用于过滤和更新表的SQL查询

时间:2014-02-13 00:20:16

标签: sql sql-server

我有一个包含NAME列的员工数据库表

在NAME字段中,我们有这样的员工姓名 - >李明(艾伦)

这是真正的名字,并且在()

中有英文昵称

我想知道我是否可以在SQL UPDATE查询中交换它

FROM:李明(艾伦):艾伦(李明)

我之所以这样,是因为用户想让它按昵称

对此列进行排序

3 个答案:

答案 0 :(得分:1)

试试这个

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

答案 1 :(得分:0)

如果我是你,我会为名字和昵称创建单独的colums。尝试获取字符串部分可以防止sql server使用可能真正重要的索引,从性能角度来看。

所以基本上有两种选择:

  1. 每次更新或插入新员工时(通过TRIGGER,应用程序代码等)解析单独列的值。
  2. 或者只创建两个计算列,但要确保它们标记为PERSISTED。
  3. 希望它有所帮助!

答案 2 :(得分:0)

我曾经参与过多个项目,并且我已经按照我的方式完成了以下3个步骤中更新的相同问题:

1)创建包含ID或Name字段的表,并将值插入表

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