SQL使用REPLACE函数来搜索表变量并更新字段

时间:2017-03-16 19:22:50

标签: sql

我试图解决的问题是使用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

我知道这段代码不在实际可行的地方,因为它可能需要一个子查询或其他东西,但我认为它传达了使用变量表中的数据作为要替换的内容的主列表的想法不同表格的每个字段。

3 个答案:

答案 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