【问题标题】:JPA/SQL Server - Use list of Integers as Temp TableJPA/SQL Server - 使用整数列表作为临时表
【发布时间】:2020-01-21 14:56:31
【问题描述】:

我在我的 Spring Boot 程序中有一个 Integer 对象列表,我想将其用作更新表的参考,仅为在此列表中找到具有 id 的记录设置一列为某个值。由于列表的潜在长度,我想避免使用 IN 子句,因为这可能会导致 SQL Server 错误太多参数。

我正在考虑的解决方案涉及类似于以下的查询:

WITH ids as (select * from <list of Integers> as pool(num))
update t set t.column = :value from <table> t, ids where t.id = ids.num

我看到的问题是将每个整数包装在 VALUE() 中的列表中,即:

WITH ids as (select * from value(1),value(2),...etc)

虽然我似乎可以通过在 Java 中迭代列表以编程方式查询字符串,但我真的希望尽可能避免这样做。我确实尝试过寻找解决方案,但找不到我想要的东西。有解决办法吗?

【问题讨论】:

    标签: sql sql-server spring-boot tsql jpa


    【解决方案1】:

    您正在构建查询无论如何,所以我个人认为构建值子句没有问题。但是,您也可以解析字符串:

    update t
        set t.column = :value
        from <table> t,
       where t.id in (select * from string_split(@ids, ','));
    

    注意:你可能需要小心类型转换,所以如果id 是一个整数:

    update t
        set t.column = :value
        from <table> t,
       where t.id in (select try_convert(int, value) from string_split(@ids, ','));
    

    【讨论】:

    • 如果可能,我想避免使用 IN 子句,因为 IN 的列表很长可能会导致参数过多而出错。
    • 不在这里不会。您描述的问题仅在 IN 子句包含值或参数列表时。这里的 IN 子句有一个子查询,而且它的可扩展性要好得多。
    猜你喜欢
    • 1970-01-01
    • 2011-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-08
    • 1970-01-01
    • 2010-09-07
    • 1970-01-01
    相关资源
    最近更新 更多