【发布时间】: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