我正在尝试编写一个方法,该方法对于给定的字符串值列表将返回字符串值列表不存在于数据库中的某些表的某些列中。
因此,例如,如果我们有一个表t,列c和插入值"1", "2"还有"3",我们将list ["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"
提前感谢。
不能select ... from
变量,只能从表或其他表中选择。
你可以创建select来返回你的列表,但是它看起来会很难看:
select "a"
union all
select "b"
union all
select "c"
可能不适用于您的数据库。
我建议你返回存在的列表
Postgres很容易处理你想要做的事情。要做到这一点需要4个步骤:
- 将列表转换为逗号分隔值的字符串
- 将该字符串转换为Array。
- 将数组转换为单个值
- 选择表中不存在的Individual值。
你必须在应用程序中做的第一步。其余的可以用单个SQL语句处理。它使用string_to_array
函数来创建数组和输出到unnest
函数的"管道",然后对那些不在指定表中的值使用NOT EXIST。结果:
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子句,并为括号表达式创建了独立的值。