Oracle 在Where子句中传递列表时,关系运算符无效

Oracle 在Where子句中传递列表时,关系运算符无效,oracle,Oracle,我有以下疑问: SELECT * FROM TABLE1 TD WHERE COL1 like '%' ||?|| '%' AND COL2 like '%' ||?|| '%' AND ((:statusId) IS NULL) OR ((:statusId) IS NOT NULL AND STATUS_ID IN (:statusId))) ORDER BY COL1 DESC; StatusId可以有多个值/单个值或null。当我使用Spring JDBC传递值1,2时,我得到了无效的

我有以下疑问:

SELECT *
FROM TABLE1 TD
WHERE COL1 like '%' ||?|| '%'
AND COL2 like '%' ||?|| '%'
AND ((:statusId) IS NULL) OR ((:statusId) IS NOT NULL AND STATUS_ID IN (:statusId)))
ORDER BY COL1 DESC;

StatusId可以有多个值/单个值或null。当我使用Spring JDBC传递值1,2时,我得到了无效的关系运算符。

如果传递的
1,2
没有撇号,那么问题是
(:statusId)为NULL
(:statusId)不是NULL

如果您传递的是
'1,2'
,则(:statusId)中的
状态ID将出现问题,因为它仅在状态ID为'1,2'时相等,而在状态ID为1或状态ID为2时不相等


考虑到以上所有因素,您应该使用撇号传递它,并将它们从(替换(:statusId,'','')

中的最后一位
STATUS\u ID中删除。您在任何地方都使用相同的参数名
statusId
。它不可能同时是一个列表和一个标量,这是因为您没有传入1,2(由逗号分隔的两个数字组成的列表);您正在传入一个用单引号括起来的字符串,如“1,2”。这不是同一件事,这是有办法解决的,但不是一件小事。这个问题已经被问了一千次了,所以,搜索“列表中的变量”或类似的问题。@mathguy确实,一个人不能通过列表。如果传递的是字符串,则查询不会返回操作所期望的行。但是如果:statusId是一个字符串,为什么会引起错误?@miracle173-我不知道OP报告的具体错误;但是,如果条件是一个数字(
status\u id
)在一个由一个成员组成的列表中
,而该字符串不能转换为数字,那么这肯定会引起错误。在纯SQL中,他应该得到“无效数字”错误。@mathguy我认为如果字符串不能转换成数字,那么就会产生一些转换错误。