我有這個表:PostgreSQL的多個元組選擇在WHERE子句
create table myTable (keyword text, category text, result text
, primary key (keyword,category));
insert into myTable values
('foo', 'A', '10'),
('bar', 'A', '200'),
('baz', 'A', '10'),
('Superman', 'B', '200'),
('Yoda', 'B', '10'),
('foo', 'C', '10');
我想根據元組(keyword,category)
檢索結果。所以基本上,有一個簡單的元組我有以下查詢:
SELECT result FROM myTable WHERE keyword LIKE '%a%' AND category = 'A';
-- returns 10,200 as expected
但我可以有很多的元組,因爲我想要的。將這個查詢擴展爲幾個元組將返回錯誤結果:
SELECT result FROM myTable
WHERE (keyword LIKE '%a%' AND category = 'A')
AND (keyword LIKE '%Superman%' AND category = 'B');
-- expected 200; but returned no rows...
SELECT distinct result FROM myTable
WHERE (keyword LIKE '%a%' AND category = 'A')
OR (NOT(keyword LIKE '%Superman%') AND category = 'B');
-- expected 10; but returned 10,200...
這非常合乎邏輯,因爲PostgreSQL不遵循操作符順序和括號。
只有OR
子句正在工作。如果我只有OR
條款,我會使用這樣的:
SELECT result FROM myTable
INNER JOIN (VALUES
('foo','C'),
('Superman', 'B')
) t(keyword,category) USING (keyword,category); -- 10,200 as expected
但它只適用於OR
和嚴格的平等。在我的情況下,我想使用LIKE
等式,我想在不同元組之間使用AND
,OR
,AND NOT
和OR NOT
。
更確切地說,當我寫:
SELECT result FROM myTable
WHERE (keyword LIKE '%a%' AND category = 'A')
AND (keyword LIKE '%Superman%' AND category = 'B');
-- expected 200; but returned no row
我的意思是我想通過這兩個子句得到的結果的交集。 第一個元組返回10,200,第二個返回200.在這種情況下,我只想返回200。
使用一個或作爲意見建議是這樣的:
SELECT distinct result FROM myTable
WHERE (keyword LIKE '%a%' AND category = 'A')
OR (keyword LIKE '%Superman%' AND category = 'B');
收益10200,但是這不是我想要......
錯誤可能的代碼?也許你的意思是:'SELECT result FROM myTable WHERE(keyword LIKE'%a%'AND category ='A')OR(keyword LIKE'%Superman%'AND category ='B');'。如果你有類別A **和**類別B,結果顯然沒有。 – 2015-03-31 09:23:04
對於'keyword LIKE'%a%'AND category ='A'' =>返回bar和baz,如同'NOT(關鍵字LIKE'%Superman%')AND category ='B'' =>返回yoda如預期的那樣 – 2015-03-31 09:27:46
@SimoKivistö對於錯誤的第一個查詢,我不想要一個OR,因爲我不想爲第一個元組獲得每個結果,爲第二個元素獲得每個結果。事實上,這是我需要的INTERSECTION。 – pidupuis 2015-03-31 09:28:09