【问题标题】:Replace part of of a string that contains any results from a column in a table替换包含表中列的任何结果的字符串的一部分
【发布时间】:2018-10-12 16:38:12
【问题描述】:

如果字符串包含表中列中的确切字符串,我正在尝试用特定文本替换表中的部分字符串。

我创建了一个列表,其中包含我想要修改的字符串到一个变量表中,然后使用 CROSS JOIN 连接到目标表,但是两个表中的数据量意味着交叉连接可能会结束到数亿行,而我想要交换数据的绝大多数字符串可能不包含第二个表中的任何数据。

也没有任何方法可以识别表 1 中的哪些记录将被修改,因为我要修改的字符串中没有标识符。我已经在下面:

DECLARE @Table2 TABLE (T2.Column1 Varchar(100), T2.Column2 INT)


INSERT INTO @Table2
Select
    T3.Column2 + ', ' + T3.Column3,
    T3.Column1
FROM Table3 T3
    WHERE T3.Column1 IN (1,2,3,4)

UPDATE Table1 SET Column1 = REPLACE(T1.Column1, T2.Column1, 'String')
        FROM Table1 T1
        CROSS JOIN @Table2 T2

我也尝试过使用CROSS APPLY 而不是CROSS JOIN,但性能保持不变。

这确实有效,但是由于必须连接两个表上的每一行,因此性能很差。有没有什么方法可以实现相同的结果,但无需加入每一行进行比较?

编辑:

样本数据:

CREATE TABLE Table1 ([Column1] varchar(4000), [Column2] INT)
CREATE TABLE Table3 ([Column1] INT, [Column2] Varchar(50), [Column3] Varchar(50))

INSERT [dbo].[Table1] ([Column1], [Column2]) VALUES ('Example Data To Replace 1: text, example', 1)
INSERT [dbo].[Table1] ([Column1], [Column2]) VALUES ('Example Data To Replace 2 example text', 2)
INSERT [dbo].[Table1] ([Column1], [Column2]) VALUES ('Example Data To Replace 3', 3)
INSERT [dbo].[Table1] ([Column1], [Column2]) VALUES ('Example Data To, Replace 4 extra text', 4)
INSERT [dbo].[Table1] ([Column1], [Column2]) VALUES ('Example Data To, Replace 5', 5)
INSERT [dbo].[Table1] ([Column1], [Column2]) VALUES ('Example Data To Replace 6', 6)
INSERT [dbo].[Table1] ([Column1], [Column2]) VALUES ('Example, Data To Replace 7', 7)

INSERT [dbo].[Table3] ([Column1], [Column2], [Column3]) VALUES (1, 'text', 'example')
INSERT [dbo].[Table3] ([Column1], [Column2], [Column3]) VALUES (2, 'To', 'Replace')
INSERT [dbo].[Table3] ([Column1], [Column2], [Column3]) VALUES (3, 'Example', 'Data')

我原以为它会返回以下内容,但实际上它只是更正了 table1 中的第一行:

Column1                                     Column2
Example Data To Replace 1: String           1
Example Data To Replace 2 example text      2
Example Data To Replace 3                   3
Example Data String 4 extra text            4
Example Data String 5                       5
Example Data To Replace 6                   6
String To Replace 7                         7

【问题讨论】:

  • 添加一些示例表数据和预期结果 - 全部为格式化文本,而不是图像。
  • 您使用的是哪个 dbms?
  • 如果这是 SQL Server 表变量在处理大数据时表现不佳,请改用临时表。这不会解决您的根本问题,但会提高性能并且是一种很好的做法。
  • @jarlh 我已经在问题中添加了示例,它是 SQL Server 2012

标签: sql sql-server tsql replace


【解决方案1】:

当您可以使用内部联接时,我不明白为什么要使用交叉联接:

UPDATE T1 
SET T1.Column1 = REPLACE(T1.Column1, T2.Column1, 'String')
FROM Table1 As T1 
JOIN Table2 As T2 ON T1.Column1 LIKE '%'+ T2.Column1 +'%'

这只会更新实际需要更新的记录,并且应该比交叉连接具有更好的性能。如果它仍然存在性能问题,您可能需要使用full text search 而不是like。

You can see a live demo on rextester.

【讨论】:

  • 我不知道您可以加入 LIKE 运算符。谢谢!
  • 可以在where 子句上使用的任何条件,也可以在on 子句上使用。很高兴帮助:-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-09
  • 2018-12-05
  • 2023-03-21
  • 2013-11-03
相关资源
最近更新 更多