如何获得与作为参数传递的列表的所有值匹配的行?

时间:2018-10-31 14:18:52

标签: java sql oracle hibernate

我有一个java方法,该方法接收一个字符串列表作为参数,并且我想获取与该列表的所有值完全匹配的行(不多也不少)。

我有两个表(一个Cases表和一个Products表),它们之间具有多对多关系。

Cookie: JSESSIONID=...

我将Oracle用作rdbms。

例如:

CASES_TABLE
ID    CASES_COMMENT       ...
1      Some comment       ...
2      Some comment2      ...
3      Some comment3      ...
...        ...

PRODUCTS_TABLE
ID   PRODUCT_CODE
1     VoIP
2     IPTV
3     PSTN
...    ...

 CASES_PRODUCTS_TABLE
CASE_ID   PRODUCT_ID
1         1
2         1
2         2
2         3
3         1
3         2
...    ...

和方法 字符串getSomeValue(列出产品);

我想得到的是ID为2的情况,因为那是完全匹配所有值的情况(ID为1的情况并非如此,因为它仅匹配一个值,而ID为2的情况并非如此因为它只匹配两个值)。

我已经阅读了有关关系划分的信息,但是我认为这不能解决我的问题。我也尝试使用IN条件,但是它执行“ OR”操作,并且我希望我的查询按所有值精确过滤,而不会留下一个左值或得到行中没有该值的行。

我尝试了以下操作:

Given the list:
  List<String> products = Stream.of("VoIP", "IPTV","PSTN").collect(Collectors.toList());;

3 个答案:

答案 0 :(得分:0)

我认为使用JQL的唯一方法是使用子查询

示例:

also

当然,您可以动态创建它以适合您想要的任意数量的字符串。

答案 1 :(得分:0)

这可以通过多种方式完成(解析函数是其中之一) 查看此答案以获取提示 Oracle sql query with all mandatory values in where condition

一种通过重用自己的查询的解决方案是

select CASES_COMMENT from
(select CASES_COMMENT , count(*) occurance from (
SELECT CASES_COMMENT
FROM CASES_TABLE CT JOIN CASES_PRODUCTS_TABLE CPT
ON CT.ID = CPT.CASE_ID
JOIN PRODUCTS_TABLE PT
ON PT.ID = CPT.PRODUCT_ID
WHERE PRODUCT_CODE IN ('VOIP', 'PSTN', 'IPTV'))
group by cases_comment)
where occurance = 3;

对于该查询,您需要另一个输入,即您要查找的输入数组的长度或大小

Sql Fiddle链接示例: http://sqlfiddle.com/#!4/29cd9/5

答案 2 :(得分:0)

我认为分组和计数应该可以满足您的需求:

select
    cp.case_id
  from products_table p
  join cases_products_table cp on cp.product_id = p.id
  where p.product_code in ('VoIP', 'PSTN', 'IPTV')
  group by cp.case_id
  having count(*) = 3

此查询应仅返回CASE_ID = 2,因为这是唯一具有三种产品的查询。