Сравните две строки в состоянии AND - PullRequest
0 голосов
/ 11 мая 2011

просто возникла проблема с использованием оператора AND в SQL, так как он возвращает нулевой набор результатов.

У меня есть следующая структура таблицы:

idcompany, cloudid, cloudkey, idsearchfield, type,userValue

Теперь я выполняю следующий оператор:

SELECT * 
FROM filter_view 
WHERE 
    (idsearchfield = 4 and compareResearch(userValue,200) = true) 
    AND (idsearchfield = 6 and compareResearch(userValue,1) = true)

compareResearch - это просто функция, которая преобразует userValue и сравнивает его с другим значением и возвращает true, если значение равно или больше.UserValue на самом деле хранится в виде строки (это решение было принято 6 лет назад)

Хорошо, я получаю нулевой набор результатов, потому что оба критерия в фигурных скобках () объединены, и одна строка может иметь только одно поле idsearch field ипоэтому один из критериев не будет совпадать.

Как мне обойти это?Мне нужно сравнение И, но это не сработает.

Я надеюсь, что моя проблема очевидна: -)

1 Ответ

1 голос
/ 11 мая 2011

Если вы поняли, что оба условия не могут быть оба одновременно истинными, каким образом сравнение AND может быть правильным?

select * 
 from filter_view 
 where (idsearchfield = 4 and compareResearch(userValue,200) = true) 
   OR (idsearchfield = 6 and compareResearch(userValue,1) = true)

Это вернет 2 строки (или больше).Или вы ищете какой-нибудь способ соотнести эти две строки, чтобы они выглядели как одна строка?


Хорошо, поэтому сделайте кучу предположений, потому что вы не включили достаточно информации в свой вопрос.

filter_view возвращает количество столбцов, один из которых представляет собой некоторую форму идентификатора записи (давайте назовем это ID).Он также включает в себя вышеупомянутые столбцы idsearchfield и userValue.

На самом деле вы хотите найти те значения id, для которых одна строка filter_view имеет idsearchfield = 4 and compareResearch(userValue,200) = true, а другая строка filter_view имеет idsearchfield = 6 and compareResearch(userValue,1) = true

Общий термин для этого - «реляционное разделение».В этом простом случае и если предположить, что id / idsearchfield уникальны в этом представлении, мы можем ответить на него:

select id,COUNT(*) 
 from filter_view 
 where (idsearchfield = 4 and compareResearch(userValue,200) = true) 
   OR (idsearchfield = 6 and compareResearch(userValue,1) = true)
 group by id
 having COUNT(*) = 2

Если это не отвечает на ваш вопрос, вам придется добавить ещеинформация к вашему вопросу, включая примерные данные и ожидаемые результаты.

...