写一段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;
主要优化点:
- 使用
LIMIT 1
替代DISTINCT
:每个字段的查询一旦找到第一个匹配项就停止扫描 - 减少数据扫描:不需要扫描整个字段的所有值来去重
- 更快的响应:特别是对于大表,性能提升显著
适用场景:
- 只需要知道哪些字段包含关键词,而不需要所有匹配记录
- 关注查询性能,特别是大数据量表
- 只需要一个存在的证明,而不需要统计数量
如果确实需要所有唯一值(而不是仅确认存在性),可以使用以下折中方案:
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
)
-- 继续添加其他字段...
这种方案在性能和结果完整性之间取得了平衡。