Database Oracle表中列中的字符串操作

Database Oracle表中列中的字符串操作,database,string,oracle,Database,String,Oracle,我的一个表格列包含名称,例如“Obama,Barack”(带双引号)。我想知道我们是否可以做点什么,让它在表格中显示为巴拉克·奥巴马。我认为我们可以通过声明一个变量来实现,但就是找不到解决方案 是的,因为这个表包含同一个人的多个事务,我们也会得到多行的“Obama,Barack”。。。数据仓库概念(事实表)。本所说的是正确的。有两列,一列是名字,一列是姓氏是正确的 但是,如果您希望更新整个数据库,您可以这样做 /*This will swap the order round*/ UPDA

我的一个表格列包含名称,例如
“Obama,Barack”
(带双引号)。我想知道我们是否可以做点什么,让它在表格中显示为巴拉克·奥巴马。我认为我们可以通过声明一个变量来实现,但就是找不到解决方案


是的,因为这个表包含同一个人的多个事务,我们也会得到多行的
“Obama,Barack”
。。。数据仓库概念(事实表)。

本所说的是正确的。有两列,一列是名字,一列是姓氏是正确的

但是,如果您希望更新整个数据库,您可以这样做

  /*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, '"', '')

编辑:-但由于我看不到您的数据,您可能需要稍微编辑一下。但这一理论是正确的。请看这里的问题,我想你想:

  • 删除引号
  • 删除逗号
  • 交换名字
所以Regexp\u replace可能是您最好的选择

UPDATE tablename
SET    column_name = REGEXP_REPLACE( column_name, '^"(\w+), (\w+)"$', '\2 \1' )
因此,
regexp\u replace
正在更改列值,只要它与模式完全匹配。表达式的各个部分是什么

  • ^“
    表示必须以双引号开头
  • (\w+)
    表示后面紧跟着一个由1个或多个字母数字字符组成的字符串。该字符串随后保存为变量
    \1
    ,因为它是第一组
    ()
  • 表示紧接着一个逗号和一个空格
  • (\w+)
    表示紧接着一个由1个或多个字母数字字符组成的字符串。该字符串随后被保存为变量
    \2
    ,因为它是第二组
    ()
  • “$
    表示紧跟在字符串末尾的双引号后面
  • \2\1
    是替换字符串,第二个保存的字符串后跟一个空格,后跟第一个保存的字符串
因此,任何不完全符合这些条件的东西都不会被替换。因此,如果有前导空格或拖尾空格,或逗号后有多个空格,或其他许多原因,文本将不会被替换

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

UPDATE tablename
SET    column_name = REGEXP_REPLACE( column_name, '^\W*(\w+)\W+(\w+)\W*$', '\2 \1' )
这是类似的,但实际上使引号和逗号成为可选的,并处理任何其他前导或尾随的发布或空白

  • ^\W*
    表示必须以零开始
  • (\w+)\w+(\w+)
    表示由一个或多个非字母数字分隔的两个字母数字字符串。这两个字符串如上所述保存
  • \W*$
    表示必须以或更多非字母数字结尾
有关oracle中regexp的更多信息,请参见此处


如果你真的想这么做,可以将逗号后的所有内容移到列的前面,
instr
应该会有帮助。请不要这样。有两列,
firstname
lastname
,然后你可以任意组合它们。哦,是的,还要注意小女士。三号博士,Esq等等。不要忘记中间名。@John,谢谢,我尽量不让人厌烦还有更多的内容。根据你住的地方,坚持自称为博士的奇怪的人,例如约翰·H·帕特里克·史密斯博士。因此,您需要
标题前
标题后
以及中间名。您好,如Ben所述,将其更改为两列是设计阶段的一部分,而我肯定不是设计阶段的一部分。所以我只能靠自己来解决这个问题(OP使用了“oracle”标签,所以我不确定关于SQL Server的答案有多重要。嗨,Eddie。谢谢你的回复。这只是关于oracle的。我尝试使用lil oracle更新作为substr、instr和length启动上述查询。但它仍然抛出了我“ORA-00907:缺少右括号”…查询对我来说很好,但仍然找不到解决方案。此外,Ben提到的更改为两列是设计阶段的一部分,我肯定不是设计阶段的一部分。:(问候!嗨,谢谢回复。.是的,我想做的所有三件事。:)我对regex exp不是很熟悉。你想启动上面的吗?正如我所做的一样,查询成功启动了,但名称仍然没有改变。是的,上面的操作应该有效。我会在回答中解释,然后添加一个更灵活的版本