如何在Snowflake中从INFORMATION_SCHEMA.TABLES查询指定表的特定列值?
跨多结构相同表查询指定条件数据并关联表名
静态拼接法(适合表数量少且固定的场景)
如果目标表数量不多,直接用UNION ALL拼接各表查询结果即可,每个查询手动指定表名:
SELECT 'TABLE1' AS table_name, val FROM TABLE1 WHERE common_column = 'this_value' UNION ALL SELECT 'TABLE2' AS table_name, val FROM TABLE2 WHERE common_column = 'this_value' UNION ALL SELECT 'TABLE3' AS table_name, val FROM TABLE3 WHERE common_column = 'this_value';
这种方法简单直观,无需复杂逻辑,但后续新增同结构表时,需要手动修改SQL。
动态SQL法(适合表数量多或可能新增的场景)
如果表数量多或会动态新增,用动态SQL自动生成查询语句更高效,不同数据库写法略有差异:
MySQL 实现
SET @sql = NULL; -- 拼接所有目标表的查询语句 SELECT GROUP_CONCAT( CONCAT( 'SELECT ''', table_name, ''' AS table_name, val FROM ', table_name, ' WHERE common_column = ''this_value''' ) SEPARATOR ' UNION ALL ' ) INTO @sql FROM INFORMATION_SCHEMA.TABLES WHERE table_name IN ('TABLE1', 'TABLE2', 'TABLE3'); -- 可改为table_name LIKE 'TABLE%'匹配前缀表 -- 执行动态SQL PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
SQL Server 实现
DECLARE @sql NVARCHAR(MAX); SELECT @sql = STRING_AGG( CONCAT( 'SELECT ''', TABLE_NAME, ''' AS table_name, val FROM ', TABLE_NAME, ' WHERE common_column = ''this_value''' ), ' UNION ALL ' ) FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME IN ('TABLE1', 'TABLE2', 'TABLE3'); EXEC sp_executesql @sql;
PostgreSQL 实现
DO $$ DECLARE rec RECORD; sql TEXT := ''; BEGIN -- 遍历目标表,拼接查询语句 FOR rec IN SELECT table_name FROM INFORMATION_SCHEMA.TABLES WHERE table_name IN ('TABLE1', 'TABLE2', 'TABLE3') LOOP sql := sql || format('SELECT ''%I'' AS table_name, val FROM %I WHERE common_column = %L UNION ALL ', rec.table_name, rec.table_name, 'this_value'); END LOOP; -- 移除末尾多余的UNION ALL sql := LEFT(sql, LENGTH(sql) - LENGTH(' UNION ALL ')); -- 执行动态SQL EXECUTE sql; END $$;
注意事项
- 动态SQL从
INFORMATION_SCHEMA.TABLES读取表名,避免了SQL注入风险;若使用用户输入的表名,需做转义处理。 - 所有目标表必须结构一致(均包含
common_column和val字段),否则执行会报错。
内容的提问来源于stack exchange,提问作者Julia Hart
相关产品推荐
相关产品推荐

