将列值设置为另一列中字符串的一部分

时间:2010-01-21 05:50:54

标签: sql-server-2005

我有一个名为CustomerName的列的表,它存储了客户的全名(即客户的名字 - 名字,姓氏和任何其他名称)。

我想重新设计这个表,使得我不应该只拥有CustomerName字段,而应该拥有CustomerFirstName,CustomerLastName和CustomerOtherNames(然后customerName可以是3个字段的串联)。

我已经在表格中有客户记录,其中包含以下格式的客户名称

客户名称

汤姆约翰

Mary Joy

圣罗伊

现在我需要运行一个更新查询,将Tom,Mary和San设置为CustomerFirstName,并将John,Joy和Roy设置为各自行的CustomerLastName,但我仍然坚持这一点。

3 个答案:

答案 0 :(得分:1)

您可以使用以下内容:

SELECT SUBSTRING(CustomerName, 1, CHARINDEX(' ', CustomerName) - 1) AS [FirstName],
SUBSTRING(CustomerName, CHARINDEX(' ', CustomerName) + 1, LEN(CustomerName)) AS [LastName]
FROM yourTableName

我从http://www.sql-server-helper.com/tips/split-name.aspx

获得了此解决方案

希望这有帮助。

马特

答案 1 :(得分:1)

以下将Matt(Lima)建议的公式整合到实际的UPDATE查询中;它还处理各种情况,如

  • 当只有FirstName时,
  • 当有前导或尾随空格时
  • 当有一个以上的空格分隔姓氏和姓氏时

或者,可以通过添加WHERE子句(WHERE CustomerName like('%%')来取消旨在确保存在空间的额外测试。

-- Ensure no leading nor trailing spaces
UPDATE myTable
SET CustomerName = TRIM(CustomerName)

UPDATE myTable
SET FirstName = TRIM(LEFT(TRIM(CustomerName), 
                     CASE CHARINDEX(' ', CustomerName) 
                       WHEN 0 THEN LEN(CustomerName) 
                       ELSE CHARINDEX(' ', CustomerName) -1 
                     END)),
    LastName = CASE CHARINDEX(' ', CustomerName)
                  WHEN 0 THEN '' 
                  ELSE TRIM(SUBSTRING(CustomerName, CHARINDEX(' ', CustomerName) + 1, LEN(CustomerName))  
               END 

答案 2 :(得分:0)

尝试以下方法: SELECT SUBSTR(CustomerName,1,INSTR(CustomerName,'',1,1)-1)作为first_name,SUBSTR(CustomerName,INSTR(客户名称,',1,1))作为fromTableName的last_name

(Oracle)的