Помогите мне создать запрос Select, который содержит 10, 'где' пункт и порядок должны быть похожими на это: результаты должны быть отображены в порядке большинства ключевых слов (где условия), соответствовал вниз к наименее подобранному.
Примечание: все 10 условий с "ИЛИ".
Помогите мне создать этот запрос. я использую SQL-сервер мс 2005
Как:
Select *
from employee
where empid in (1,2,4,332,434)
or empname like 'raj%'
or city = 'jodhpur'
or salary >5000
В вышеупомянутом запросе все они записывают, которым условия максимума соответствий должны быть на вершине, и меньше записи условия соответствия должно быть в основе.
SELECT *
FROM (SELECT (CASE WHEN cond1 THEN 1 ELSE 0 END +
CASE WHEN cond2 THEN 1 ELSE 0 END +
CASE WHEN cond2 THEN 1 ELSE 0 END +
...
CASE WHEN cond10 THEN 1 ELSE 0 END
) AS numMatches,
other_columns...
FROM mytable
) xxx
WHERE numMatches > 0
ORDER BY numMatches DESC
РЕДАКТИРОВАТЬ: Этот ответ был опубликован до того, как вопрос был изменен конкретным примером. Решение Марсело обращается к реальной проблеме. С другой стороны, мой ответ отдавал приоритет совпадениям в определенных полях.
Вы можете попробовать что-то вроде следующего, используя те же выражения в предложении ORDER BY
, что и в предложении WHERE
:
SELECT *
FROM your_table
WHERE field_1 = 100 OR
field_2 = 200 OR
field_3 = 300
ORDER BY field_1 = 100 DESC,
field_2 = 200 DESC,
field_3 = 300 DESC;
Я недавно ответил на аналогичный вопрос о переполнении стека, который может вас заинтересовать:
Есть много вариантов / ответов. Лучший ответ зависит от размера данных, нефункциональных требований и т. Д.
Тем не менее, я бы сделал что-то вроде этого (легко читать / отлаживать):
Select * from
(Select *, iif(condition1 = bla, 1, 0) as match1, ..... , match1+match2...+match10 as totalmatchscore from sourcetable
where
condition1 = bla or
condition2 = bla2
....) as helperquery
order by helperquery.totalmatchscore desc