Сервер Sql: напишите запрос, который постепенно расслабляет ограничения

У нас есть хранимая процедура, где мы хотим найти наилучшее возможное совпадение, но мы хотим ослабить некоторые ограничения, если мы не найдем начальные результаты, поэтому мы можем хотя бы вернуть некоторые результаты.

В настоящее время это выполняется повторением одного и того же запроса с другим предложением where и прекращением, когда запрос возвращает какие-либо результаты. Что-то вроде:

select * from table where (field1 = @param1 and field2 = @param2 and field3 = @param3)
if @ROWCOUNT = then select * from table where (field1 = @param1 and field2 = @param2)
-- ... etc.

Тем не менее, мне не нравится этот подход, поскольку это означает повторение запроса несколько раз, поэтому я хотел бы сделать то же самое и свести к минимуму повторение.

1 ответ

В одну сторону

SELECT TOP 1 WITH TIES *
FROM table
WHERE ( field1 = @param1 AND field2 = @param2 )
ORDER BY CASE WHEN field1 = @param1 THEN 1 ELSE 0 END + CASE WHEN field2 = @param2 THEN 1 ELSE 0 END + CASE WHEN field3 = @param3 THEN 1 ELSE 0 END DESC

licensed under cc by-sa 3.0 with attribution.