如何在SQL Server中按列名筛选并查询最新日期的表数据?
解决方案
你提供的SQL语句无法实现按列名筛选的需求,因为WHERE子句的作用是过滤表中的行数据,而非选择特定列名的列。针对你的需求,这里提供两种实现方式:
1. 静态列名查询(适用于固定App前缀场景)
如果明确要查询的App(比如App1)对应的列名,直接指定列名即可,搭配子查询获取最新的CollectDate行:
SELECT App1Red, App1Blue, App1Green, App1Yellow FROM your_table_name WHERE CollectDate = (SELECT MAX(CollectDate) FROM your_table_name);
2. 动态SQL查询(适用于需要灵活切换App前缀的场景)
如果需要根据输入的App前缀(比如App1/App2)自动匹配对应列,可以通过查询系统表获取列名,拼接动态SQL执行。以下是不同数据库的实现示例:
MySQL/MariaDB版本
-- 设置要查询的App前缀和表名 SET @app_prefix = 'App1'; SET @table_name = 'your_table_name'; -- 拼接动态SQL SET @sql = CONCAT( 'SELECT ', (SELECT GROUP_CONCAT(COLUMN_NAME SEPARATOR ', ') FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = @table_name AND COLUMN_NAME LIKE CONCAT(@app_prefix, '%')), ' FROM ', @table_name, ' WHERE CollectDate = (SELECT MAX(CollectDate) FROM ', @table_name, ')' ); -- 执行动态SQL PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
SQL Server版本
-- 设置要查询的App前缀和表名 DECLARE @app_prefix NVARCHAR(50) = 'App1'; DECLARE @table_name NVARCHAR(100) = 'your_table_name'; DECLARE @sql NVARCHAR(MAX); -- 拼接动态SQL SELECT @sql = CONCAT( 'SELECT ', STRING_AGG(COLUMN_NAME, ', '), ' FROM ', @table_name, ' WHERE CollectDate = (SELECT MAX(CollectDate) FROM ', @table_name, ')' ) FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = @table_name AND COLUMN_NAME LIKE CONCAT(@app_prefix, '%'); -- 执行动态SQL EXEC sp_executesql @sql;
内容的提问来源于stack exchange,提问作者Johnny
相关产品推荐
相关产品推荐

