如何用不同参数值执行同一SQL并合并UNION查询结果集?
多年份SQL查询结果合并的参数化优化方案
方案1:生成年份列表关联查询(最简洁)
不用重复写多个SELECT,直接生成需要查询的年份集合和原表关联,一次性拿到所有结果:
WITH Year_List AS ( SELECT 2020 AS Year UNION ALL SELECT 2021 UNION ALL SELECT 2022 ) SELECT CAST(y.Year AS VARCHAR(4)) AS Period, w.Name, w.Status, w.Wage FROM Wages_Table w JOIN Year_List y ON YEAR(w.Wage_Date) = y.Year;
要加新年份?只需要在Year_List里多写一行UNION ALL SELECT 年份就行,不用复制整个查询块。
方案2:参数化表值函数(适合频繁复用)
如果需要反复用不同年份集合查询,可以建一个表值函数,传入年份字符串参数:
CREATE FUNCTION GetWagesByYears (@Years NVARCHAR(MAX)) RETURNS TABLE AS RETURN ( SELECT CAST(y.value AS VARCHAR(4)) AS Period, w.Name, w.Status, w.Wage FROM Wages_Table w JOIN STRING_SPLIT(@Years, ',') y ON YEAR(w.Wage_Date) = CAST(y.value AS INT) );
调用时直接传年份列表:
SELECT * FROM GetWagesByYears('2020,2021,2022');
注意:STRING_SPLIT是SQL Server 2016+支持的函数,其他数据库可以用对应拆分方法,比如MySQL的SUBSTRING_INDEX、PostgreSQL的STRING_TO_ARRAY。
方案3:动态SQL(极致灵活)
如果需要随时调整年份参数,用动态SQL拼接查询语句:
DECLARE @Years NVARCHAR(MAX) = '2020,2021,2022'; DECLARE @SQL NVARCHAR(MAX); SET @SQL = 'SELECT CAST(y.Year AS VARCHAR(4)) AS Period, w.Name, w.Status, w.Wage FROM Wages_Table w JOIN (VALUES ' + STUFF((SELECT ',(' + Year + ')' FROM STRING_SPLIT(@Years, ',') FOR XML PATH('')), 1, 1, '') + ') y(Year) ON YEAR(w.Wage_Date) = y.Year;'; EXEC sp_executesql @SQL;
这种方式改年份只需要修改@Years变量,完全不用动查询结构。
内容的提问来源于stack exchange,提问作者Joe Napoleon
相关产品推荐
相关产品推荐

