【问题标题】:Making a SQL query that selects of list of values from more than one column进行从多列中选择值列表的 SQL 查询
【发布时间】: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 吗?

标签: java sql oracle jdbc


【解决方案1】:

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

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

【讨论】:

  • 只是对我发现的使用“IN”的警告,对于 oracle,它的硬性限制是每次调用 1000 个条目。
  • @Snedden27 仅适用于单值列表;具有多个值的列表,例如这个,列表中最多可以有 100,000 个元素。 stackoverflow.com/a/17019130/1509264
  • 嗯,这很好,知道,正在考虑批处理 sql,但这有帮助,谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-06
  • 2020-10-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多