sql - 在 SQL 中根据条件创建变量?
问题描述
您可以根据 SQL Server 中的条件创建变量吗?
例如,我将传递一个字符串,例如'2016,2017'
我的查询将创建 2 个变量,因为它有 2 年
现在,如果我在字符串中过了 10 年,例如'2010,2011,...'
我的查询也必须创建 10 个变量...
这甚至可能吗?
编辑:
伪码
declare @string as nvarchar(max) = '2014,2015,2016'
declare @count as int = (select LEN(REPLACE(@string, ',', '**')) - LEN(@string) )
while @count <> 0
begin
--create variable statement here
Declare @var + @count as nvarchar(max)
set @string = (select substring(@string,0,CHARINDEX(',', @string)))
set @var +@count = @string
set @count = count - 1
end
select @var1, @var2
输出
2014 2015
编辑 2
原因:
我想要一个 SP 来输出查询的销售数据,因为我已经在这里询问了如何获取数据,我现在的任务是使其动态化,特别是自从我们保留 15 年以来的那些年。查询的数据可能从 1 年到 15 年
我的第一个想法是把岁月当作一根绳子
exec SP_test '2014,2015,2016'
这让我想到创建动态变量,以便我可以替换查询中的年份,以及创建查询所需的字符串以产生适当的结果
完整的伪代码
declare @string as nvarchar(max) = '2014,2015,2016'
declare @count as int = (select LEN(REPLACE(@string, ',', '**')) - LEN(@string) )
while @count <> 0
begin
--create variable statement here
Declare @var + @count as nvarchar(max)
set @string = (select substring(@string,0,CHARINDEX(',', @string)))
set @var +@count = @string
set @count = count - 1
end
--up to this point lets say I have created @var1 and @var2
SELECT Item,Price,Quantity,PriceYear,QuantityYear INTO TempFinal
FROM (
SELECT Item,Price,Quantity, 'Price+@var1' as PriceYear,'Quantity+@var1' as QuantityYear FROM @Table+@var1
UNION ALL
SELECT Item,Price,Quantity, 'Price@var2' as PriceYear,'Quantity@var2' as QuantityYear FROM @Table+@var2
) MyTables
这只是一个示例,但查询应该构建字符串。该示例有 2 年,因此查询创建了两个 select 语句(这是另一个问题,但我想我可能有一个解决方案)然后是涉及年份的唯一字段。
SELECT item, SUM([Price+@var1])[Price+@var1],SUM([Quantity+@var1])[Quantity+@var1],SUM([Price+@var2])[Price+@var2],SUM([Quantity+@var2])[Quantity+@var2]
FROM (
SELECT item,Price,Quantity,PriceYear,QuantityYear
FROM TempFinal) up
PIVOT (SUM(Quantity) FOR QuantityYear IN ([Quantity+@var2],[Quantity+@var2]) AS pvt
PIVOT (SUM(Price) FOR PriceYear IN ([Price+@var1],[Price+@var2]) AS pvt2
GROUP by item
ORDER BY item
--do take note that @var1 contains `2014` and @var2 contains `2015`
解决方案
据我所知,不可能以这种方式动态生成变量,除非您完全动态地创建 SQL 逻辑并使用EXECUTE
or执行它sp_executesql
。
您可以考虑改用临时表或表变量。然后该表将用作一种数组。
declare @string as nvarchar(max) = '2010,2011,2012,2013,2014,2015,2016';
declare @vars as table ([index] int identity, [value] nvarchar(max));
declare @charindex as int = CHARINDEX(',', @string);
declare @value as nvarchar(max);
while @charindex > 0
begin
set @value = substring(@string, 0, @charindex);
set @string = substring(@string, @charindex + 1, LEN(@string));
insert into @vars ([value]) values (@value);
set @charindex = CHARINDEX(',', @string);
end;
select [index], [value] from @vars order by [index];
很抱歉稍微调整你的代码。我想发布一个工作示例(给出您的预期输出)。
额外说明:
如果您还想包含最后一个值,您可能必须在代码中添加更复杂的逻辑......或者您可能只是在@string
值后面附加一个额外的逗号......
推荐阅读
- html - 为什么这些按钮没有正确居中?例如,中间按钮不在标题下方居中
- java - 使搜索栏触摸区域更大
- python-2.7 - Docker - 包安装奇怪的行为
- linear-regression - SARIMA 假设
- python - Python请求带有令牌(oauth2)FatSecret API的授权标头
- javascript - 如何从节点js中的缓冲区中找到损坏的文件
- php - 基于 HTTP 方法 PHP 的 REST API 导致 404 Not Found
- android - 在 android studio 4.0 中创建动态功能后出现此错误
- java - 使用自定义 javax 验证器时为存储库获取 NullPointerException
- security - 对 github pages 公共 repo 有敏感内容