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
)
-- 继续添加其他字段...

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

相关推荐
码爸9 小时前
线性回归算法
算法·机器学习·线性回归
KIDULT°9 小时前
MySQL系列 (1):数据库原理
运维·数据库·mysql·云计算
Coder-magician10 小时前
《代码随想录》刷题打卡day51:图论-part09(dijistra堆优化,Bellman_ford算法)
算法·图论
Nil20810 小时前
leetcode 763划分字母区间
算法·leetcode·职场和发展
不会就选b10 小时前
算法日常・每日刷题--<动态规划>20
算法·leetcode·动态规划
青少儿编程课堂11 小时前
迪杰斯特拉(Dijkstra)算法:单源最短路与赛场路线规划
c++·python·算法·bfs·信息学竞赛
不会就选b11 小时前
算法日常・每日刷题--<动态规划>19
算法·leetcode·职场和发展
没有钱的钱仔13 小时前
协方差矩阵含义
算法·机器学习·矩阵
垆边人似月.13 小时前
华为机试题 :和为 K 的子数组个数
算法·leetcode·华为