SQL查询:筛选列名逻辑关联的字段满足指定条件的记录
可直接执行的原生SQL实现方案
方案1:静态SQL(无依赖、全环境兼容,优先使用)
核心逻辑是逐组匹配同项目的负责人、结果字段,只要任意一组满足「负责人为Simpson且对应项目结果为open」,就返回整行记录。写法同时兼容MS Access和SQL Server,复制后替换表名即可直接执行。
SELECT * FROM 替换为你的实际表名 WHERE -- ProjectA字段组判断 (ProjectA_Responsible = 'Simpson' AND ProjectA_Result = 'open') OR -- ProjectB字段组判断 (ProjectB_Responsible = 'Simpson' AND ProjectB_Result = 'open') -- 后续新增ProjectC、ProjectD等项目时,参照上面的格式追加OR判断块即可 -- OR (ProjectC_Responsible = 'Simpson' AND ProjectC_Result = 'open')
针对给出的4条样例数据,上述SQL执行后会准确返回Part-ID为101、203的2条记录,完全匹配预期结果。
方案2:动态SQL(自动适配新增列,无需手动维护判断条件)
如果不想每次新增项目列都修改SQL,可以在SQL Server端创建存储过程,自动从系统表读取所有符合%_Responsible、%_Result命名规则的字段,动态拼接查询逻辑,Access前端直接调用存储过程即可,不需要额外写VBA拼接语句。
SQL Server端存储过程代码:
CREATE PROCEDURE GetSimpsonOpenRecords AS BEGIN DECLARE @sql NVARCHAR(MAX) DECLARE @tableName SYSNAME = N'替换为你的实际表名' DECLARE @condition NVARCHAR(MAX) = N'' -- 自动拼接所有项目组的判断条件 SELECT @condition = @condition + N'OR (' + QUOTENAME(r.name) + N' = ''Simpson'' AND ' + QUOTENAME(REPLACE(r.name, '_Responsible', '_Result')) + N' = ''open'') ' FROM sys.columns r WHERE r.object_id = OBJECT_ID(@tableName) AND r.name LIKE '%_Responsible' -- 校验同项目对应的Result字段存在,避免字段缺失报错 AND EXISTS ( SELECT 1 FROM sys.columns res WHERE res.object_id = r.object_id AND res.name = REPLACE(r.name, '_Responsible', '_Result') ) -- 去掉拼接字符串开头多余的OR SET @condition = STUFF(@condition, 1, 3, '') SET @sql = N'SELECT * FROM ' + QUOTENAME(@tableName) + N' WHERE ' + @condition EXEC sp_executesql @sql END
调用时直接执行EXEC GetSimpsonOpenRecords即可,后续不管新增多少组ProjectX_Responsible/ProjectX_Result字段,存储过程都会自动识别匹配,不需要修改代码。
内容的提问来源于stack exchange,提问作者karlo922
相关产品推荐
相关产品推荐

