【问题标题】:Selecting values from list parameter从列表参数中选择值
【发布时间】:2021-10-13 21:51:48
【问题描述】:

我正在尝试编写一个方法,该方法对于给定的字符串值列表将返回数据库中某个表的某些列中不存在的字符串值列表。

因此,例如,如果我们有一个表 t,其列 c 和插入的值“1”、“2”和“3”,我们传递列表 [“1”、“2”、“4”、“5 "] 到方法,它应该返回 ["4", "5"]。

我尝试过这样的事情:

@Query(value = "select t.id from :list as t(id) left join table_name s " +
        "on s.column_name= t.id where s.column_name is null", nativeQuery = true)
    List<String> findNonExistingValues(List<String> list);

但它没有像我希望的那样工作,给出错误: syntax error at or near "$1"

提前致谢。

【问题讨论】:

    标签: java postgresql jpa


    【解决方案1】:

    你不能select ... from变量,只能从表或其他选择。

    您可以创建返回列表的选择,但它看起来很难看:

    select "a"
    union all
    select "b"
    union all
    select "c"
    

    可能不适用于您的数据库。

    我建议您返回数据库中存在的列表,并在 Java 代码中从另一个列表中减去。

    【讨论】:

    • Tnx 为您解答。如果我在 dbeaver sql 编辑器中使用这个非常相同的查询,但不是:list,我添加 ''''(values ('1'), ('2'), ('4'), ('5')) ''',它按预期工作。
    • 不同的数据库以不同的方式处理它。 Db 驱动程序无法修改您的 SQL。你需要自己改变它。试一试from (values :list)
    【解决方案2】:

    Postgres 可以轻松处理您要执行的操作。要做到这一点需要 4 个步骤:

    1. 将您的列表转换为逗号分隔值的字符串。
    2. 将该字符串转换为数组。
    3. 将该数组转换为单个值。
    4. 选择表中不存在的单个值。

    您必须在应用程序中执行的第一步。其余的可以用一条 SQL 语句来处理。它使用函数string_to_array 创建数组和“管道”,然后将它们放入unnest 函数中,然后对不在指定表中的值使用NOT EXIST。结果:(见example here

    with tgt_list (tval) as
         (select unnest(string_to_array('1,2,4,5', ','))::integer)
    select tval 
      from tgt_list 
     where not exists 
           (select null 
              from tbl 
             where tval = tbl.val
           ) ;  
    

    您只需要将上面的硬核值替换为参数即可。对不起,我不知道你的 ORM 或 Java。

    注意:您的 DBeaver 测试实际上与 DBeave 本身无关。 Postgres 打断了 VALUES 子句,为带括号的表达式创建了独立的值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多