【问题标题】:SQL Mass Character RemovalSQL 批量字符删除
【发布时间】:2016-10-02 15:15:53
【问题描述】:

好的,所以我们现在有一个数据库,其中包含用户登录并保存状态信息。保存状态几乎只是一个 JSON blob,但我们发布的客户端有一个错误,其中生成了一个 '\' 字符,然后每次用户登录时都会为每个 '\ 添加一个新的'\' '。如果用户在足够长的时间内退出并重新登录,这将导致相当严重的问题 - 最终导致用户无法再登录。

我们修复了客户端,但所有这些保存状态在我们修复它们之前都无法使用。

这里的最终目标是使用 SQL 查询访问数据库,以尝试在一行中存在多个“\”时删除所有“\”。建议?也许是某种 REPLACE 调用?

【问题讨论】:

  • 正在使用的数据库类型是什么,例如SQL Server?
  • 它的 postgres,我绝对可以对它运行 SQL
  • 看一眼documentation,类似于regexp_replace(column, '\\{2,}', '') 的东西应该作为替换函数。 (第一个反斜杠用于转义第二个。)
  • 我用 SELECT REGEXP_REPLACE("tableName", '\\{2,}', '') FROM table 打了它,但它似乎没有用。查询成功执行,我想知道它是否只是删除了 '\' 字符总数的一个子集?不过我会继续深入研究,regexp_replace 绝对是一个不错的起点

标签: sql database postgresql replace


【解决方案1】:

使用类似的东西

UPDATE yourTable SET JsonBlob = regexp_replace(JsonBlob, '\\{2,}', '');

'\\{2,}' 表示两个或多个反斜杠。第一个反斜杠是为了转义第二个反斜杠。它必须是 POSIX 正则表达式。

PostgreSQL 9.5.3 文档:9.4. String Functions and Operators

【讨论】:

  • 我可以只使用列名作为 regexp_replace 调用中的第一个参数吗?还是我需要通过并明确选择 json blob。
  • @TSI25 感谢您的反馈 :)
【解决方案2】:

您可能想研究 CTE。它们允许您递归调用数据,直到达到特定条件。在这种情况下,您将递归调用 REPLACE(myString, '\', '') 直到 \'s 的计数为 1。

这将处理可能有 1 个斜线到 1000 多个斜线的情况。

【讨论】:

  • OP 已更新以指定 Postgres。我对 Postgres 以及我发布的解决方案是否仍然可行一无所知。
  • 另外,我更喜欢@Andrew Morton 在 cmets 中的回答,而不是我发布的解决方案。我不知道 regexp_replace() 函数;太酷了。
  • 有些数据库有正则表达式;微软的 SQL Server 是一个明显的例外——我猜他们认为 CLR 函数是一种可用的替代方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-24
  • 2019-02-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多