oracle 如何使用SQL来过滤一个列,使其同时“等于某个值”和“不等于另一个值”?

ss2ws0br  于 2023-08-04  发布在  Oracle
关注(0)|答案(3)|浏览(246)

我有一个名为PM_BATCH_ST的表:
| 结果| RESULT |
| --| ------------ |
| ISC| ISC |
| LLC| LLC |
| ISC| ISC |
| LLC| LLC |
| ISC| ISC |
| LLC| LLC |
| LLC| LLC |
| ISC| ISC |
我可以过滤表以获得只有ISC条目的BATCH_ID吗?所以我想要的结果就是1000888940。
我知道我可以通过

WHERE RESULT LIKE '%ISC%'

字符串
但这也将返回1000564932、1000585739、1000384769,它们也有LLC的条目。

htrmnn0y

htrmnn0y1#

你可以这样选择

SELECT BATCH_ID
FROM PM_BATCH_ST
GROUP BATCH_ID
HAVING COUNT(*) = 1 AND MAX(RESULT) = 'ISC'

字符串
与WHERE子句不同,HAVING子句在分组结果上被省略。COUNT(*) = 1确保只有一个结果,MAX(RESULT) = 'ISC'确保此结果用于ISC。我使用MAX是因为我们需要一个聚合函数,但是因为我们只有一个结果,所以MIN也可以工作。

bmp9r5qi

bmp9r5qi2#

在查询中,我们首先过滤所有包含ISC的Batch_id,然后计算所有不包含ISC的行的出现次数,多个ISC将被忽略

SELECT
"BATCH_ID"  FROM PM_BATCH_ST p1
WHERE EXISTS ( SELECT 1 FROM PM_BATCH_ST WHERE p1."BATCH_ID" ="BATCH_ID" AND "RESULT" = 'ISC')
GROUP BY "BATCH_ID"
HAVING SUM(CASE WHEN "RESULT" != 'ISC' THEN 1 ELSe 0 END ) = 0

字符串
| BATCH_ID |
| ------------ |
| 1000888940 |
fiddle

1mrurvl1

1mrurvl13#

可以使用group byhaving子句来实现:

select BATCH_ID
from mytable
group by BATCH_ID
having sum(case when RESULT = 'ISC' then 1 else 0 end) = count(*)

字符串
这将返回BATCH ID,其中总行数必须等于RESULT = 'ISC'的总行数。
要获得只有一个ISC条目的BATCH_ID,请将count(*)= 1添加到having子句:

having sum(case when RESULT = 'ISC' then 1 else 0 end) = count(*) and count(*) = 1


Demo here

相关问题