You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Redshift的IN子句中使用字符串形式的列表值?

Redshift中字符串ID列表用于IN语句的最优实现方法

问题场景

现有Redshift数据库,需要将字符串形式存储的ID列表(如'1,2,3,4,5')用于IN查询,预期实现类似如下逻辑:

WITH test_data AS (
  SELECT 1 AS c
  UNION
  SELECT 2
  UNION
  SELECT 10
  UNION
  SELECT 100
)
SELECT * FROM test_data 
WHERE c IN (SELECT '1,2,3,4,5')

报错翻译

你尝试转数组的写法触发的错误:

error: operator does not exist: character varying = text[]

翻译为:

错误:不存在操作符:character varying = text[]

正确实现方法

方法1:简洁版(适合短ID列表)

直接使用string_to_array生成数组,配合ANY操作符,注意不要把数组包在子查询里:

WITH test_data AS (
  SELECT 1 AS c
  UNION ALL
  SELECT 2
  UNION ALL
  SELECT 10
  UNION ALL
  SELECT 100
)
SELECT * FROM test_data 
WHERE c::text = ANY(string_to_array('1,2,3,4,5', ','));

如果c是整数类型,也可以直接转数组为整数类型匹配:

WHERE c = ANY(string_to_array('1,2,3,4,5', ',')::int[])

方法2:高性能版(适合长ID列表)

使用Redshift的split_to_table函数将字符串拆分为多行记录,再通过JOIN或IN子查询匹配:

WITH test_data AS (
  SELECT 1 AS c
  UNION ALL
  SELECT 2
  UNION ALL
  SELECT 10
  UNION ALL
  SELECT 100
),
id_list AS (
  -- 将字符串拆分为单行ID记录
  SELECT value::int AS id FROM split_to_table('1,2,3,4,5', ',')
)
SELECT td.* FROM test_data td
JOIN id_list il ON td.c = il.id;

或者用IN子查询:

WITH test_data AS (
  SELECT 1 AS c
  UNION ALL
  SELECT 2
  UNION ALL
  SELECT 10
  UNION ALL
  SELECT 100
)
SELECT * FROM test_data 
WHERE c IN (SELECT value::int FROM split_to_table('1,2,3,4,5', ','));

原写法错误原因

你之前的代码错误在于将string_to_array放在SELECT子查询中,这会返回单个包含数组的行(类型为text[]),而数据库尝试把c::text(字符串类型)和整个数组做相等比较,类型不匹配导致报错。

最优选择

  • 如果ID列表长度较短(几十到上百个):用方法1的ANY写法,代码简洁,执行效率足够。
  • 如果ID列表长度较长(上千个及以上):用方法2的split_to_table + JOIN写法,Redshift对JOIN的查询优化远优于长列表的IN子查询,能避免性能瓶颈。

内容的提问来源于stack exchange,提问作者Andrew B

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 19:52:41