You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用不同参数值执行同一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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 01:10:29