进行从多列中选择值列表的 SQL 查询

Posted

技术标签:

【中文标题】进行从多列中选择值列表的 SQL 查询【英文标题】:Making a SQL query that selects of list of values from more than one column 【发布时间】:2020-12-10 18:42:14 【问题描述】:

我有一张类似这样的桌子:

AccountNum Name RoutingNum
a1 name1 r1
a2 name2 r2
a2 name3 r1

我想选择具有特定配对帐号和路由号码的所有行,例如:

input
List<accountNum, routingNumber> pairList = <a1, r1>, <a2, r2>

sql returns:
| AccountNum | Name           | RoutingNum      |
| --------   | -------------- |--------------
| a1         | name1          | r1              |
| a2         | name2          | r2              |

对于某些情况,我只想打一个电话,我将使用 jdbc 进行,这是我的 java 代码,它只选择帐号,这不是我想要的,因为我也想使用 routingNum 进行选择:

String inSql = String.join(",", Collections.nCopies(plainAccountNumberEntries.size(), "?"));
        List<String>accountNumberList = Arrays.asList("a1", "a2");

        return ddsJdbc.query(
                String.format("SELECT * from table where AccountNum in (%s)", inSql),
                accountNumberList.toArray(),
                new someMapper()
        );

我想避免为列表中的每个条目多次调用数据库。

感谢您的宝贵时间。

【问题讨论】:

这有点不清楚。您是否要求选择带有((AccountNum="a1" and RoutingNum="r1") or (AccountNum="a2" and RoutingNum="r2")) 的行?还是AccountNum in ("a1","a2") and RoutingNum in ("r1","r2"),它也会返回[a1,r2][a2,r1] 行? 对不起,如果是我要求返回 (AccountNum="a1" and RoutingNum="r1") 或 (AccountNum="a2" and RoutingNum="r2")) 好吧,有你WHERE 子句。如果您有可变数量的条件,则每次都必须动态构建语句。但请使用占位符 (?) 而不是构建值,以避免 SQL 注入。 我正在使用占位符,不是吗?还有你所说的 where 子句是什么意思,它是在 for 循环中生成单独的 sql 吗? 【参考方案1】:

使用IN 条件和列表中的多个表达式:

SELECT *
from   table_name
where  ( AccountNum, RoutingNum ) in ( ( 'A1', 'R1' ), ( 'A2', 'R2') )

【讨论】:

只是对我发现的使用“IN”的警告,对于 oracle,它的硬性限制是每次调用 1000 个条目。 @Snedden27 仅适用于单值列表;具有多个值的列表,例如这个,列表中最多可以有 100,000 个元素。 ***.com/a/17019130/1509264 嗯,这很好,知道,正在考虑批处理 sql,但这有帮助,谢谢

以上是关于进行从多列中选择值列表的 SQL 查询的主要内容,如果未能解决你的问题,请参考以下文章

如何从 SQL Server 中的值列表中进行选择

在试听中如何用SQL选中从表选取所有列

从列表中的每个值中选择前 10 个元素

从跨越多列的名称范围编译不同值的列表

如何从由 SQL 查询填充的列表框中获取信息?

从视图中的 SQL 子查询返回值列表