[英]query to get the records have some_id and some_flag such that all same some_id must have all some_flag ='Y' in oracle
[英]Finding values in postgres array (some must be in, some must not be in at the same query)
我有一個ids integer[]
而且,我想找到包含1
但不能包含2, 3, 4
行
但是[1] OR [1, 5] OR [1, 6, 7]
<- 這個數據沒問題。 [2,3,4]
不是。
所以我嘗試了這種方式
SELECT *
FROM table_test
WHERE 1 = ANY(ids) AND 2 <> ANY(ids) AND 3 <> ANY(ids) AND 4 <> ANY(ids)
但它返回1 = ANY(ids)
部分
[1 2 3]
[1 3 4]
[1]
[1 5]
[1 6 7]
我想要這個數據
[1]
[1 5]
[1 6 7]
我怎么解決這個問題?
非常感謝!
您應該將ALL
與<>
一起使用。
如果至少一個元素不等於 2,則表達式2 <> ANY(ids)
為真——情況總是如此,因為在第一個條件下,您需要至少一個元素為 1(不是 2)。
SELECT *
FROM table_test
WHERE 1 = ANY(ids)
AND 2 <> ALL(ids)
AND 3 <> ALL(ids)
AND 4 <> ALL(ids)
另一種選擇是使用重疊運算符&&
(“有共同的元素”)並否定它:
SELECT *
FROM table_test
WHERE 1 = ANY(ids)
AND NOT ids && array[3,4,5]
您的查詢非常接近,但實際上是:
1
(這沒關系)2
、 3
和4
(這意味着[1,3,4]
有效,因為1
不是2,3 or 4
,因此滿足條件) 您真正需要檢查的情況 #2 是所有元素都不是2, 3, 4
。
您更新后的查詢現在是:
SELECT * FROM table_test WHERE 1 = ANY(ids) AND 2 <> ALL(ids) AND 3 <> ALL(ids) AND 4 <> ALL(ids);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.