2011-10-08 24 views
0

其中一个表的列包含名称,例如"Obama, Barack"(带双引号)。我想知道我们是否可以采取一些措施使其在表格中显示为Barack Obama。我认为我们可以通过声明一个变量来实现,但无法找到解决方案。Oracle表中的列中的字符串操作

是的,因为这表包含同一个人,我们还与具有"Obama, Barack"多行最终的多笔交易......一个数据仓库的概念(事实表)。

+1

如果你这样做吨真的严重他可以将逗号后的所有内容移动到列的前面,'instr'应该有所帮助。请不要。有两列,'firstname'和'lastname',然后你可以将它们组合起来,不过你可以。 – Ben

+1

哦,是的,留意小姐三博士等。不要忘记中间名。 – John

+0

@John,谢谢,我正在努力不要承受更多的负载。例如,根据你住的地方,神父博士约翰·帕特里克·史密斯博士,坚持要自称自己。所以你需要“前标题”和“后标题”以及中间名。 – Ben

回答

1

@Ben所说的是正确的。有两列第一名和第二名是正确的。

但是如果你希望,因为它是你可以做更新整个数据库...

/*This will swap the order round*/ 
    UPDATE TableName SET NameColumn = SUBSTRING(NameColumn, 1, CHARINDEX(',',NameColumn))+SUBSTRING(NameColumn, CHARINDEX(',', NameColumn),LEN(NameColumn)-CHARINDEX('"', NameColumn,2)) 

    /*This will remove the quotes*/ 
    UPDATE TableName SET NameColumn = REPLACE(NameColumn, '"', '') 

编辑: - 但我看不到你的数据,你可能需要稍微编辑。但是这个理论是正确的。看到这里http://www.technoreader.com/SQL-Server-String-Functions.aspx

+1

该OP使用的标记'甲骨文',所以我不知道如何相关的答案关于SQL Server是 –

+0

嗨埃迪 感谢您的答复。这是关于甲骨文只..我试图解雇上面律甲骨文的更新,SUBSTR,INSTR和长度查询。不过它仍然把我“ORA-00907:缺少右括号” ..查询对我来说很好,但仍无法找到解决 而且更改为两列如由本所提到的设计阶段,我是肯定不会的一部分的一部分。:( 祺! – rockys

1

从我假设的问题,你想:

  • 删除引号
  • 删除逗号
  • 交换姓名

所以REGEXP_REPLACE可能是你最好的选择

UPDATE tablename 
SET column_name = REGEXP_REPLACE(column_name, '^"(\w+), (\w+)"$', '\2 \1') 

所以regexp_replace正在改变列值,只要它完全匹配模式。什么表达式的部分是

  • ^"意味着它必须以双引号
  • (\w+)启动装置紧接着1个或多个字母数字字符的字符串。此字符串然后保存作为可变\1,因为它的所述第一组的()
  • ,装置紧接着一个逗号和一个空间
  • (\w+)装置紧接着1个或多个字母数字字符的字符串。此字符串然后保存作为可变\2因为它的所述第二组的()
  • "$装置立即由双引号即字符串
  • \2 \1的端follwed被替换字符串,第二保存字符串后面加一个空格,之后将第一保存

,所以,只要这并不完全符合这些条件不会被取代。所以如果你有一个空格或者空格,或者逗号后有多个空格,或者其他许多原因,文本将不会被替换。

一个更灵活的(也许是太灵活)的选择可能是:

UPDATE tablename 
SET column_name = REGEXP_REPLACE(column_name, '^\W*(\w+)\W+(\w+)\W*$', '\2 \1') 

这是类似的,但有效地使引号和逗号可选,与其他任何开头或结尾pubctuation或空格交易。

  • ^\W*手段的使用必须或多个非alphanumberics启动
  • (\w+)\W+(\w+)指由一个或多个非字母数字分开的两个alphanumberic字符串。两个字符串以上
  • \W*$手段如所描述的,然后必须用或多个非alphanumberics结束保存
上在Oracle的regexp

更多信息是这里

+0

您好,感谢的答复.. 是所有的三件事情我想做的事情。:) 米没有那么familar与正则表达式exp ..你的意思是发射上述?我也一样,查询确实火成功,但仍名字持平.. – rockys

+0

没错上面应该有工作。我会在答案中解释它,然后添加更灵活的版本 – Sodved