Redshift SQL搜索表中所有字段的值

写一段Redshift的SQL,检查一个表格里所有的字符串字段是否有值等于keyword的单元格,如果有,输出一张表,包含Schema名、表名、字段名和值,输出结果集不包含重复数据。

sql 复制代码
WITH column_info AS (
  -- 获取表的所有字符串类型字段
  SELECT 
    ordinal_position,
    table_schema,
    table_name,
    column_name
  FROM information_schema.columns 
  WHERE table_schema = 'your_schema_name'  -- 替换为实际的schema名
    AND table_name = 'your_table_name'     -- 替换为实际的表名
    AND data_type IN ('character', 'character varying', 'text', 'varchar', 'char')
),
check_queries AS (
  -- 为每个字符串字段生成检查查询(使用LIMIT 1)
  SELECT 
    ordinal_position,
    table_schema,
    table_name,
    column_name,
    'SELECT * FROM (SELECT ''' || table_schema || ''' AS schema_name, ''' || table_name || ''' AS table_name, ''' || column_name || ''' AS column_name, ' || column_name || ' AS value FROM ' || table_schema || '.' || table_name || ' WHERE ' || column_name || ' = ''keyword'' LIMIT 1)' || CASE ordinal_position WHEN 1 THEN ';' ELSE ' UNION ALL ' END AS query_text
  FROM column_info
)
-- 所有检查查询并合并结果
SELECT 
    query_text
FROM check_queries
ORDER BY ordinal_position DESC;

主要优化点:

  1. 使用LIMIT 1替代DISTINCT:每个字段的查询一旦找到第一个匹配项就停止扫描
  2. 减少数据扫描:不需要扫描整个字段的所有值来去重
  3. 更快的响应:特别是对于大表,性能提升显著

适用场景:

  • 只需要知道哪些字段包含关键词,而不需要所有匹配记录
  • 关注查询性能,特别是大数据量表
  • 只需要一个存在的证明,而不需要统计数量

如果确实需要所有唯一值(而不是仅确认存在性),可以使用以下折中方案:

sql 复制代码
-- 对每个字段单独查询,但使用LIMIT来限制返回数量
SELECT * FROM (
SELECT 'your_schema' AS schema_name, 'your_table' AS table_name, 'column1' AS column_name, column1 AS value
FROM your_schema.your_table 
WHERE column1 = 'keyword'
LIMIT 10)  -- 限制每个字段最多返回10条记录

UNION ALL

SELECT * FROM (
SELECT 'your_schema', 'your_table', 'column2', column2
FROM your_schema.your_table 
WHERE column2 = 'keyword'
LIMIT 10
)
-- 继续添加其他字段...

这种方案在性能和结果完整性之间取得了平衡。

相关推荐
leke200310 小时前
2025年10月17日
算法
CoovallyAIHub10 小时前
Mamba-3震撼登场!Transformer最强挑战者再进化,已进入ICLR 2026盲审
深度学习·算法·计算机视觉
Aqua Cheng.10 小时前
代码随想录第七天|哈希表part02--454.四数相加II、383. 赎金信、15. 三数之和、18. 四数之和
java·数据结构·算法·散列表
怀揣小梦想10 小时前
跟着Carl学算法--哈希表
数据结构·c++·笔记·算法·哈希算法·散列表
Nebula_g10 小时前
Java哈希表入门详解(Hash)
java·开发语言·学习·算法·哈希算法·初学者
Kent_J_Truman10 小时前
【模拟散列表】
数据结构·算法·蓝桥杯·散列表·常识类
Lchiyu10 小时前
哈希表 | 454.四数相加II 383. 赎金信 15. 三数之和 18. 四数之和
算法
玩镜的码农小师兄10 小时前
[从零开始面试算法] (04/100) LeetCode 136. 只出现一次的数字:哈希表与位运算的巅峰对决
c++·算法·leetcode·面试·位运算·hot100
王道长服务器 | 亚马逊云11 小时前
AWS WAF 实战篇|如何防御爬虫、CC攻击与恶意POST请求
云计算·aws
RTC老炮11 小时前
webrtc弱网-AcknowledgedBitrateEstimatorInterface类源码分析与算法原理
网络·算法·webrtc