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

如何在SQL中创建变量数组以简化IN子句查询?

没问题!其实很多SQL方言都支持把IN子句里的ID列表做成可复用的变量/参数形式,不同数据库的实现方式略有不同,我给你整理几种常见的方案:

不同SQL数据库的实现方法

MySQL/MariaDB

如果你用的是MySQL,有两种常用方式:

  • 用户定义变量+FIND_IN_SET:直接用IN的话变量会被当成单个字符串,所以需要用FIND_IN_SET函数匹配
SET @Id_list = '123,456,789';
SELECT * FROM Table WHERE FIND_IN_SET(Id, @Id_list);
  • 准备语句(推荐):更安全,能避免SQL注入风险
PREPARE stmt FROM 'SELECT * FROM Table WHERE Id IN (?, ?, ?)';
SET @a = '123', @b = '456', @c = '789';
EXECUTE stmt USING @a, @b, @c;
DEALLOCATE PREPARE stmt;

SQL Server

SQL Server支持表变量或字符串拆分函数:

  • 表变量方式:适合需要多次复用列表的场景
DECLARE @Id_list TABLE (Id VARCHAR(10));
INSERT INTO @Id_list VALUES ('123'), ('456'), ('789');
-- 两种查询写法都可以
SELECT * FROM Table WHERE Id IN (SELECT Id FROM @Id_list);
-- 或者用JOIN
SELECT t.* FROM Table t JOIN @Id_list i ON t.Id = i.Id;
  • STRING_SPLIT拆分字符串(SQL Server 2016及以上版本支持)
DECLARE @Id_str VARCHAR(50) = '123,456,789';
SELECT * FROM Table WHERE Id IN (SELECT value FROM STRING_SPLIT(@Id_str, ','));

PostgreSQL

PostgreSQL的数组特性非常适合这种场景:

DO $$
DECLARE
  Id_list TEXT[] := ARRAY['123','456','789'];
BEGIN
  SELECT * FROM "Table" WHERE Id = ANY(Id_list);
END $$;

如果只是单次查询,也可以直接在语句里用数组:

SELECT * FROM "Table" WHERE Id = ANY(ARRAY['123','456','789']);

通用提示

  • 你最初设想的Id_list = ('123','456','789')这种直接在原生SQL里定义变量的写法,SQL本身并不支持(除非用上述数据库特定的语法),因为SQL是声明式语言,和Python这类编程语言的变量逻辑不同。
  • 如果是在应用程序中调用SQL(比如Python、Java),强烈推荐用参数绑定,既安全又简洁。比如Python+psycopg2的示例:
id_list = ['123', '456', '789']
cursor.execute("SELECT * FROM Table WHERE Id IN %s", (tuple(id_list),))

内容的提问来源于stack exchange,提问作者Sean M

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:02:39