我有这个表: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