SQL:获取两个变量的公共值
编辑:为了更好地解释这个场景,我重新表述了原来的问题 我有什么 我有一个名为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],因此我的最终输出必须如下所示。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列 我如何获得这样的输出 /// 如何将两个变量的公共
@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]
谢谢你的回答,我已经编辑了这个问题,以便更好地解释这个场景。您可以看一看吗?您的编辑并没有改变这样一个事实,即您只需要进行字符串分析和搜索。但是,是否可以获取所需的列,而忽略不可用的列?