У меня есть эта таблица:PostgreSQL выбор несколько кортежей в ИНЕКЕ
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 в этом случае.
Использование OR как предполагающее, в комментариях, как это:
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 (ключевое слово LIKE '% a%' AND category = 'A') ИЛИ (ключевое слово LIKE '% Superman%' AND category = 'B');'. Если у вас есть категория A ** AND ** категория B, то результат, очевидно, ничего. –
Что касается 'keyword LIKE '% a%' AND category = 'A'' => возвращает bar и baz, как ожидалось, где« NOT »(ключевое слово LIKE«% Superman% ») AND category =' B'' => возвращает yoda как ожидалось –
@ SimoKivistö Для первого запроса по ошибке я не хочу OR, так как я не хочу получать каждый результат для первых кортежей PLUS каждый результат для второго. На самом деле это ИНТЕРСИЦИЯ, которая мне нужна. – pidupuis