我试图解决的问题是使用REPLACE函数来查看值列表并进行所有各种替换,但挑战是在不同的表上执行此操作。基本上,我正在寻找比25-100嵌套REPLACE函数更聪明的方法。
以下是问题的简化版本: 用于保存字符列表/字符串(随机长度和混合字符)的变量表我想在以后找到并替换。
DECLARE @ReplaceList TABLE (String VARCHAR(100))
INSERT INTO @ReplaceList (String)
VALUES ('AAA1 - '), ('AAB1 - '), ('A3 !'), ('BC4 - ')
String
AAA1 -
AAB1 -
A3 !
BC4 -
然后我有一个包含超过一千行的表(Jobs),其中包含所有这些被替换/删除的描述。
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
我知道这段代码不在实际可行的地方,因为它可能需要一个子查询或其他东西,但我认为它传达了使用变量表中的数据作为要替换的内容的主列表的想法不同表格的每个字段。
答案 0 :(得分:0)
在mysql中,这将对您有所帮助。
select replace(j.Title,rl.string, '') from ReplaceList rl , job j where j.Title like concat('%',rl.string_,'%');
答案 1 :(得分:0)
假设您的标题表格可以格式化:
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
答案 2 :(得分:0)
我没有看到加入与替换工作相结合。您需要为每个字符串应用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