Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server SQL Server比较字符和更新列_Sql Server_Sql Server 2008_Tsql - Fatal编程技术网

Sql server SQL Server比较字符和更新列

Sql server SQL Server比较字符和更新列,sql-server,sql-server-2008,tsql,Sql Server,Sql Server 2008,Tsql,我在一个表中有两列 x | y ========|========= AMDN | AMDNOXYZ AMDNO | AMNOXYZ 我想比较这两列,并根据列x上的某些条件更新列y。如果列y中有字符在列x中不存在,则只需删除这些字符而不是整个字符串。其思想是在两列中逐个字符进行比较。在任何时间点,列y中都不能有任何字符不在列x中,或者换句话说,列y只能是列x的子集 因此,结果将是 x | y ========|=======

我在一个表中有两列

     x    |    y
  ========|=========
    AMDN  | AMDNOXYZ
    AMDNO | AMNOXYZ
我想比较这两列,并根据列
x
上的某些条件更新列
y
。如果列
y
中有字符在列x中不存在,则只需删除这些字符而不是整个字符串。其思想是在两列中逐个字符进行比较。在任何时间点,列
y
中都不能有任何字符不在列
x
中,或者换句话说,列
y
只能是列
x
的子集

因此,结果将是

     x    |    y
  ========|=========
    AMDN  | AMDN
    AMDNO | AMNO

请提供帮助。

这是一个在sql server中创建的函数,它将x和y列作为输入并返回所需的输出

create function remove_char(@x_string varchar(500),@y_string varchar(500))
returns varchar(500)
as
begin
    declare @Y  table(autoid int identity,c char(1))
    declare @i int=1;declare @c char(1);
    while(LEN(@y_string)>=@i)
    begin
        select @c=substring(@y_string,@i,1);
        Insert into @Y values(@c)
        select @i=@i+1
    end

    declare @X table(autoid int identity,c char(1))
    set @i=1;
    while(LEN(@x_string)>=@i)
    begin
        select @c=substring(@x_string,@i,1);
        Insert into @X values(@c)
        select @i=@i+1
    end
return( select STUFF(( select ''+c from @Y
 where c in (select c from @X) order by autoid
  FOR XML PATH('')),1,0,'') )
end
范例

选择dbo.remove_char('AMDNO','AMNOXYZ')

您可以使用此函数更新表

 update <table> set y=dbo.remove_char(x,y)
更新集y=dbo.remove_char(x,y)

这是在sql server中创建的一个函数,它将x和y列作为输入并返回所需的输出

create function remove_char(@x_string varchar(500),@y_string varchar(500))
returns varchar(500)
as
begin
    declare @Y  table(autoid int identity,c char(1))
    declare @i int=1;declare @c char(1);
    while(LEN(@y_string)>=@i)
    begin
        select @c=substring(@y_string,@i,1);
        Insert into @Y values(@c)
        select @i=@i+1
    end

    declare @X table(autoid int identity,c char(1))
    set @i=1;
    while(LEN(@x_string)>=@i)
    begin
        select @c=substring(@x_string,@i,1);
        Insert into @X values(@c)
        select @i=@i+1
    end
return( select STUFF(( select ''+c from @Y
 where c in (select c from @X) order by autoid
  FOR XML PATH('')),1,0,'') )
end
范例

选择dbo.remove_char('AMDNO','AMNOXYZ')

您可以使用此函数更新表

 update <table> set y=dbo.remove_char(x,y)
更新集y=dbo.remove_char(x,y)

发布您的查询尝试。我们不是来做你的工作的。@stefan我不知道该使用什么函数。我找不到将varchar转换为char数组进行比较的方法。我真的在寻求帮助。至少要有关于使用什么的指南。你陈述问题的方式只有完成你全部工作的人才能提供正确的答案。如果你想对你的子问题提出一个更一般的问题,它可能会给你更多的选票。我们大多数人都是专业人士,我们不免费为其他程序员工作。通常我不在数据库层处理数据,而是在业务层处理数据。特别是字符串的编译和操作对于sql server函数来说非常枯燥。您能在业务层解决这个问题吗?@ADC否必须在表中更新此问题。请发布您的查询尝试。我们不是来做你的工作的。@stefan我不知道该使用什么函数。我找不到将varchar转换为char数组进行比较的方法。我真的在寻求帮助。至少要有关于使用什么的指南。你陈述问题的方式只有完成你全部工作的人才能提供正确的答案。如果你想对你的子问题提出一个更一般的问题,它可能会给你更多的选票。我们大多数人都是专业人士,我们不免费为其他程序员工作。通常我不在数据库层处理数据,而是在业务层处理数据。特别是字符串的编译和操作对于sql server函数来说非常枯燥。您能在业务层解决这个问题吗?@ADC否必须在表中更新此问题。