从列更新和替换字符串的开始部分

Posted

技术标签:

【中文标题】从列更新和替换字符串的开始部分【英文标题】:Update and Replace a start part of string from a column 【发布时间】:2015-09-18 10:21:32 【问题描述】:
**MyTable**
*myColumn*
/A/B/C/XYZ
/A/B/C/abc
...

/A/B/C/whatever 不是固定的,是动态的,需要替换为 /1/2/3/whatever 之类的东西,我喜欢将其更改如下,保持最后 / 之后的最后一部分完整。

/1/2/3/XYZ
/1/2/3/abc
...

我运行以下查询

SELECT SUBSTRING(myColumn, 0,  len(myColumn) - CHARINDEX('/',REVERSE(myColumn)) +1 )
FROM MyTable

正确返回需要更换的部分

/A/B/C
/A/B/C
/A/B/C
...

通用更新是我从UPDATE and REPLACE part of a string了解到的

Update MyTable SET myColumn = REPLACE(myColumn, '/A/B/C','/1/2/3')

所以我要更新和替换的最终查询是

Update MyTable
SET myColumn = REPLACE(myColumn,
                       (SELECT SUBSTRING(myColumn, 0,  len(myColumn) - CHARINDEX('/',REVERSE(myColumn)) +1 )
                        FROM MyTable),
                       '/1/2/3')

但它给出了以下错误

子查询返回超过 1 个值。这是不允许的,当 子查询遵循 =、!=、、>= 或当子查询用作 一个表达式。

我怀疑我的子查询的输出不包含引号 '...' ,如何输入或者还有什么问题?

【问题讨论】:

子选择中需要一个条件,所以它只返回一行! (其实不需要sub-select,用列名代替吧。)' @jarlh ,感谢您的提示,我需要更新所有行,并且每一行都可能返回各自的值,所以我希望该列的每一行只有一个值需要替换.如果第一部分 /X/Y/Z 是动态的并且每行可以不同,我们如何只选择一行。 【参考方案1】:

你能试试这个吗:

UPDATE myTable
SET myColumn = '/1/2/3/' + REVERSE(SUBSTRING(REVERSE(myColumn),0,CHARINDEX('/',REVERSE(myColumn))))

它应该在前面插入/1/2/3/,并保留原始列值中最后一个/之后的部分。

编辑:

顺便说一句,如果您删除了SELECT FROM 部分,您的查询也将起作用。

UPDATE myTable
SET myColumn = REPLACE(myColumn, SUBSTRING(myColumn, 0, len(myColumn) - CHARINDEX('/',REVERSE(myColumn)) +1), '/1/2/3')

问题是,您的 select 查询返回了表中的所有行,并尝试使用子查询中的值更新您的单行值。这就是你出错的原因。

【讨论】:

:) 谢谢,您的解决方案就像一个魅力。接受它作为答案。它帮助了我,肯定会帮助其他人。问候,

以上是关于从列更新和替换字符串的开始部分的主要内容,如果未能解决你的问题,请参考以下文章

如何在 MySQL 中运行更新查询并替换匹配的字符串

使用 SSIS 从列中删除特殊字符 " 和 '

从列中删除逗号,空格和“NULL”字符串为0(零)

SQL 更新替换字符串中的部分文本

如何从列类型列表中删除 pandas DataFrame 中的空值

更新列值,替换字符串的一部分