SQL使用REPLACE函数搜索表变量并更新字段
我试图解决的问题是使用REPLACE函数查看一个值列表并进行所有各种替换,但挑战是在不同的表上执行此操作。基本上,我正在寻找一种比执行25-100个嵌套替换函数更聪明的方法 以下是问题的简化版本: 变量表,用于保存我以后要查找和替换的字符/字符串(随机长度和混合字符)列表SQL使用REPLACE函数搜索表变量并更新字段,sql,Sql,我试图解决的问题是使用REPLACE函数查看一个值列表并进行所有各种替换,但挑战是在不同的表上执行此操作。基本上,我正在寻找一种比执行25-100个嵌套替换函数更聪明的方法 以下是问题的简化版本: 变量表,用于保存我以后要查找和替换的字符/字符串(随机长度和混合字符)列表 DECLARE @ReplaceList TABLE (String VARCHAR(100)) INSERT INTO @ReplaceList (String) VALUES ('AAA1 - '), ('AAB1 - '
DECLARE @ReplaceList TABLE (String VARCHAR(100))
INSERT INTO @ReplaceList (String)
VALUES ('AAA1 - '), ('AAB1 - '), ('A3 !'), ('BC4 - ')
String
AAA1 -
AAB1 -
A3 !
BC4 -
然后,我有一个表(作业),其中有超过1000行的描述,这些描述需要全部替换/删除
Title
AAA1 - Job 1
AAA1 - Job 2
A3 ! Job 4
BC4 - Job 5
所需的最终结果是:
Title
Job 1
Job 2
Job 4
Job 5
我对SQL代码输出行的粗略想法与
SELECT REPLACE(Jobs.Title,@ReplaceList.String,'')
FROM Jobs
我知道这段代码离实际工作的地方不远,因为它可能需要子查询或其他东西,但我认为它传达了使用变量表中的数据作为不同表的每个字段中要替换内容的主列表的想法 在mysql中,这将帮助您
select replace(j.Title,rl.string, '') from ReplaceList rl , job j where j.Title like concat('%',rl.string_,'%');
假设标题表的格式具有一定的一致性:
Create table #ReplaceList (String VARCHAR(100))
INSERT INTO #ReplaceList (String)
VALUES ('AAA1 - '), ('AAB1 - '), ('A3 ! - '), ('BC4 - ')
Select * from #ReplaceList;
Create table #Title (mytitle varchar(50))
INSERT INTO #Title values ('AAA1 - Job 1'), ('AAA1 - Job 2'), ('A3 ! - Job 4'), ('BC4 - Job 5')
Select * from #Title
create table #string_job (string varchar(100), job varchar(50))
insert into #string_job
select left(mytitle, 7) as string,
right(mytitle, 5) as job
from #title
select string, job from #string_job
select J.job as 'Title'
from #string_job J
right join #ReplaceList R
on R.string = J.string
我看不到连接与替换组合工作。您需要为每个字符串(即行)应用一次
REPLACE
函数来搜索和替换,并且每个后续检查都需要提供上一个检查的结果。因此,需要迭代
下面的步骤就可以了。我构建了搜索表以允许完整字符串替换,只需将“ReplaceWith”设置为空字符串以清空文本。(请注意,当您用其他可能需要替换的文本替换文本时,会在订单字符串中搜索相关内容!)
对于大型数据集,这不会执行得太好,因为对于每个搜索字符串,您都需要遍历目标表一次,并且每次遍历时都要更新每一行
SET NOCOUNT on
-- Set up table of strings to search through
DECLARE @Jobs TABLE
(Title varchar(100) not null)
INSERT @Jobs values
('AAA1 - Job 1, box ')
,('AAA1 - Job 2, fox ')
,('A3 ! Job 4 ')
,('BC4 - Job 5')
,('The quick red fox')
SELECT *
from @Jobs
-- Set up table of search-and-replace strings
DECLARE @ReplaceList TABLE
(
LookFor varchar(100) not null
,ReplaceWith varchar(100) not null
,ReplaceOrder int not null PRIMARY KEY
)
INSERT @ReplaceList values
('AAA1 - ', 'AA1 - ', 1)
,('AAB1 - ', 'AB1 - ', 2)
,('A3 !', 'A3 - ', 3)
,('BC4 - ', 'XXX - ', 4)
,('fox', 'lox', 5)
,(' ', ' ', 6)
SELECT *
from @ReplaceList
DECLARE
@LoopCheck int
,@NextToDo int
,@ReplaceThis varchar(100)
,@ReplaceWith varchar(100)
SET @LoopCheck = 0
WHILE @LoopCheck is not null
BEGIN
-- Loop is processed once for every row in @ReplaceList
SET @NextToDo = null
-- Get the next replace string to check
SELECT
@NextToDo = min(ReplaceOrder)
from @ReplaceList
where ReplaceOrder > @LoopCheck
IF @NextToDo is null
-- No more to do, exit out
BREAK
-- Get the replacement strings
SELECT
@ReplaceThis = LookFor
,@ReplaceWith = ReplaceWith
from @ReplaceList
where ReplaceOrder = @NextToDo
-- Update all target strings as necessary
UPDATE @Jobs
set Title = replace(Title, @ReplaceThis, @ReplaceWith)
-- On to the next one
SET @LoopCheck = @NextToDo
END
-- Waddawe got?
SELECT *
from @Jobs
也许交叉应用会有帮助…您希望删除“Job”左边的字符串。。。您正在使用哪个数据库?我删除了冲突的DBMS标记。请为您实际使用的DBMS添加一个。我尝试替换/删除的字符串并不总是在左侧。因为它是工作数据库,所以我无法发布实际数据。这非常有用,但我意识到在简化示例时有一点疏忽。列表中可能需要在单个字符串中替换多个内容。例如,值可以是“AAAA-作业1 A3!-”,因此,需要在同一字符串中进行两次替换。如何替换@ReplaceList中的所有项目,而不是在第一个项目之后停止?问题是标题格式不一致。我基本上只需要一个字符串列表,无论它们出现在标题字符串中的什么位置,都可以将其全部拉出。所以Left()和Right()在我的实际案例中不起作用。这正是我所要寻找的,因为它涵盖了我更大的实际数据库中出现的所有其他案例。谢谢你的帮助!我有一个后续问题,如果我想让这个行为更像一个被选中的字段的函数,那么代码将如何更改。例如,我没有创建一个全新的变量表。我希望我的代码使它像一个可以在select语句中使用的函数(我们称之为CustomReplace)。从@Jobs中选择CustomerReplace(标题)。通过这种方式,它查看一个值并在“at”Replace列表表中运行,而不创建需要重新连接的整个单独的表。我将获取上面的代码并对其进行修改,以适应多语句函数调用(签出
CREATE function
),唯一的参数是要修改的值。但是,请注意,如果嵌套在较大的查询中,这种函数可能会严重降低性能。能否提供一个链接或示例,说明如何创建这种多语句函数?还有,是否存在临时功能?我有只读访问权限,所以我不能直接在数据库中创建函数,或者如果函数可以存储在本地数据库中,那么引用也可以。非常感谢您的帮助。SQL Server联机丛书是您的首选。以下是CREATE FUNCTION
的语法条目和示例: