SQL:获取两个变量的公共值

SQL:获取两个变量的公共值,sql,sql-server,Sql,Sql Server,编辑:为了更好地解释这个场景,我重新表述了原来的问题 我有什么 我有一个名为Table1的表,有5列a、B、C、D、E 我需要什么 现在从这个表中,我只需要选择几个存储在变量@var1中的列。这个变量@var1是动态变化的 @var1='A,B,F' SET@sql='从[表1]中选择'+@var1+' EXEC sp_executesql@sql 这会导致一个错误,因为表1中没有F列 问题: 现在由于表中没有F列,我希望输出表只包含A列和B列 我如何获得这样的输出 /// 如何将两个变量的公共

编辑:为了更好地解释这个场景,我重新表述了原来的问题

我有什么

我有一个名为Table1的表,有5列a、B、C、D、E

我需要什么

现在从这个表中,我只需要选择几个存储在变量@var1中的列。这个变量@var1是动态变化的

@var1='A,B,F'

SET@sql='从[表1]中选择'+@var1+'

EXEC sp_executesql@sql

这会导致一个错误,因为表1中没有F列

问题:

现在由于表中没有F列,我希望输出表只包含A列和B列

我如何获得这样的输出

/// 如何将两个变量的公共值转换成sql中的另一个变量? 我在两个不同的变量中有一个串联的列名,如下所示 例子: 我在两个不同的变量中有一个串联的列名,如下所示。 变量1: @第1列=[ABC]、[EFG]、[MNO]、[XYZ] 变量2: @第2列=总和[ABC]为[ABC],总和[IJK]为[IJK],总和[MNO]为[MNO] 所需结果: 由于这两个变量中都存在列名[ABC]和[MNO],因此我的最终输出必须如下所示。
@finalColumns=[ABC],[MNO]

这是字符串解析的练习,而不是真正的SQL。当然,你可以从互联网上抓取一个字符串分割算法并使用它

declare @columns1 varchar(255) = '[ABC],[EFG],[MNO],[XYZ]';
declare @columns2 varchar(255) = 'SUM([ABC]) as [ABC],sum([IJK]) as [IJK],sum([MNO]) as [MNO]';
declare @p1 int = 0;
declare @p2 int = charindex(',', @columns1 + ',', @p1);
declare @s varchar(32);
declare @out varchar(256) = '';
declare @sep varchar(1) = '';

while @p2 > 0
begin
    set @s = substring(@columns1, @p1+1, @p2-@p1-1);
    if charindex(@s, @columns2) > 0
    begin
        set @out = @out + @sep + @s;
        set @sep = ',';
    end
    set @p1 = @p2;
    set @p2 = charindex(',', @columns1 + ',', @p1+1);
end
print @out

首先拆分两个变量中的值

然后比较两个拆分的行。然后用逗号连接匹配的行。像这样的

DECLARE @columns1 VARCHAR(max) = '[ABC],[EFG],[MNO],[XYZ]',
        @columns2 VARCHAR(max) = 'Sum([ABC]) as [ABC],sum([IJK]) as [IJK],sum([MNO]) as [MNO]',
        @result varchar(max)

set @result = (SELECT sp_col+','
FROM  (SELECT Split.a.value('.', 'VARCHAR(100)') sp_col
       FROM   (SELECT Cast ('<M>' + Replace(@columns1, ',', '</M><M>')
                            + '</M>' AS XML) AS Data) AS F
              CROSS APPLY Data.nodes ('/M') AS Split(a)) a
WHERE  EXISTS (SELECT sp_col
               FROM  (SELECT Split.a.value('.', 'VARCHAR(100)') sp_col
                      FROM   (SELECT Cast ('<M>' + Replace(@columns2, ',', '</M><M>')
                                           + '</M>' AS XML) AS Data) AS S
                             CROSS APPLY Data.nodes ('/M') AS Split(a))b
               WHERE  Charindex(a.sp_col, b.sp_col) > 0) 
               for xml path(''))

select @result = left(@result,LEN(@result)-1)

select @result  --[ABC],[MNO]

谢谢你的回答,我已经编辑了这个问题,以便更好地解释这个场景。您可以看一看吗?您的编辑并没有改变这样一个事实,即您只需要进行字符串分析和搜索。但是,是否可以获取所需的列,而忽略不可用的列?