Показывать точное совпадение в верхней части внутреннего частичного совпадения T-SQL-запроса - PullRequest
2 голосов
/ 09 марта 2012

Предположим, у вас есть запрос, который выглядит следующим образом:

SELECT * FROM client
WHERE identifyingnumber LIKE '%86%'

Иногда может быть точное совпадение, означающее, что идентификационный номер равен 86. Как лучше всего сделать запись с таким точным соответствиемначало запроса?

Ответы [ 3 ]

7 голосов
/ 09 марта 2012

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

SELECT * 
FROM client
WHERE identifyingnumber LIKE '%86%'
ORDER BY LEN(identifyingnumber)

Это будет запрос с высокой загрузкой процессора из-за операции LEN. Возможно, вы захотите создать столбец для длины идентифицирующего номера в клиентской таблице - возможно, в виде вычисляемого столбца - чтобы сохранить некоторый ЦП для выбора.

Что касается того, что лучше ... Это зависит от вашей системы. Опция UNION, предложенная Паоло, также пришла мне на ум первым, за исключением того, что требуется обработка двух разных значений параметров, при условии, что вы параметризуете свои запросы (как я всегда делаю).

4 голосов
/ 09 марта 2012

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

SELECT *, 
    CASE 
        WHEN identifyingnumber = '86' THEN 1
        WHEN identifyingnumber LIKE '86%' THEN 2
        ELSE 3
    END AS Rank
FROM client
WHERE identifyingnumber LIKE '%86%'
ORDER BY Rank

например. это дает несколько уровней рейтинга

Или ...

SELECT *
FROM client
WHERE identifyingnumber LIKE '%86%'
ORDER BY 
    CASE WHEN identifyingnumber = '86' THEN 1 
        WHEN identifyingnumber LIKE '86%' THEN 2 ELSE 3 END
4 голосов
/ 09 марта 2012

возможно не самый элегантный способ, но он должен работать:

SELECT *
FROM
(
SELECT *, 1 AS PRIO FROM client
WHERE identifyingnumber = '86'
UNION
SELECT *, 2 AS PRIO FROM client
WHERE identifyingnumber LIKE '%86%'
AND identifyingnumber <>'86'
) AS X
ORDER BY PRIO
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...