【发布时间】:2017-08-12 11:48:40
【问题描述】:
我在优化 SQL 查询以进行数据清理时遇到问题。
事实上,我有一个表,它是多个特殊字符和单词的一种参考。我们就叫它ABNORMAL(ID,PATTERN)
我还有另一个表 INDIVIDUALS 包含一个列 (NAME),我想通过删除表 ABNORMAL 中存在的所有字符来清理它。
目前,我已尝试使用更新语句,但不确定是否有更好的方法。
接近一
使用 while 循环将包含来自 ABNORMALS 的所有字符替换为空白 '' 并使用内置的 REPLACE 进行一次更新
DECLARE @REPLACE_EXPRESSION nvarchar(max) ='REPLACE(NAME,'''','''')'
DECLARE @i int = 1
DECLARE @nbr int = (SELECT COUNT(*) FROM ABNORMAL)
-- CURRENT_CHARAC
DECLARE @CURRENT_CHARAC nvarchar(max)
-- NEW REPLACE EXPRESSION TO IMBRICATE INTO THE REPLACE EXPRESSION VARIABLE
DECLARE @CURR_REP NVARCHAR(max)
-- STRING TO BUILD AN SQL QUERY CONTAINING THE REPLACE EXPRESSION
DECLARE @UPDATE_QUERY nvarchar(max)
WHILE @i < @nbr
BEGIN
SELECT @CURRENT_CHARAC=PATTERN FROM CLEANSING_STG_PRISM_FRA_REF_UNSIGNIFICANT_VALUES WHERE ID_PATTERN=@i ;
SET @REPLACE_EXPRESSION = REPLACE(@REPLACE_EXPRESSION ,'NAME','REPLACE(NAME,'+''''+@CURRENT_CHARAC+''''+','''')')
set @i=@i+1
END
SET @UPDATE_QUERY = 'UPDATE INDIVIDUAL SET NAME ='+ @REPLACE_EXPRESSION
EXEC sp_executesql @UPDATE_QUERY
方法二
使用 while 循环选择每个异常字符,并使用包含要删除的字符的替换进行更新:
DECLARE @i int = 1
DECLARE @nbr int = (SELECT COUNT(*) FROM ABNORMAL)
-- CURRENT_CHARAC
DECLARE @CURRENT_CHARAC nvarchar(max)
-- STRING TO BUILD AN SQL QUERY CONTAINING THE REPLACE EXPRESSION
DECLARE @UPDATE_QUERY nvarchar(max)
WHILE @i < @nbr
BEGIN
SELECT @CURRENT_CHARAC=PATTERN FROM CLEANSING_STG_PRISM_FRA_REF_UNSIGNIFICANT_VALUES WHERE ID_PATTERN=@i ;
UPDATE INDIVIDUAL
SET NAME = REPLACE(NAME,@CURRENT_CHARAC,'')
SET @i=@i+1
END
我已经针对 200 万条记录测试了这两种方法,我发现第一种方法比第二种方法更快。我想知道您是否已经尝试过类似的和新的(更好的)想法。
【问题讨论】:
标签: sql sql-server performance