Приоритеты для каждого предложения запроса - PullRequest
0 голосов
/ 26 ноября 2011

Я пытаюсь расставить приоритеты для результатов в SQL Server 2008R2, но мне не удается расставить приоритеты для тех, которые мне нужны, сначала вверху.Например: если я запрашиваю город, штат и почтовый индекс, и у меня есть почтовый индекс, и он совпадает, я бы хотел, чтобы результат был наверху.Если почтовый индекс не соответствует, но город и штат соответствуют, я хотел бы, чтобы они были посередине, тогда, если совпадает только страна, результат может быть внизу

Если я пытаюсь использовать LIKEв порядке по выражению запрос не выполняется.Пока у меня есть:

DECLARE @cityState nvarchar  = 'new york';
DECLARE @zip nvarchar  = '11204';

DECLARE @myposition geography;
SELECT * FROM ZipCodes  z
WHERE Zip LIKE @zip OR (City LIKE @cityState+'%' and State LIKE @cityState+'%' ) 
ORDER BY z.Zip LIKE @zip desc

Ответы [ 4 ]

2 голосов
/ 26 ноября 2011

Как насчет этого?

SELECT * FROM ZipCodes  z
WHERE Zip LIKE @zip OR (City LIKE @cityState+'%' and State LIKE @cityState+'%' ) 
ORDER BY 
CASE
    WHEN z.Zip LIKE @zip THEN 1
    WHEN City LIKE @cityState+'%' and State LIKE @cityState+'%' THEN 2
    WHEN State LIKE @cityState+'%' THEN 3
    ELSE 4
END,
z.Zip,
City,
State
0 голосов
/ 26 ноября 2011

Спасибо, @gpeche. Я на самом деле сделал несколько вещей:

  • Объявление длины по параметрам
  • Учет сокращений штатов (Нью-Йорк против Нью-Йорка)

Что привело к:

 DECLARE @myposition geography;
 SELECT * FROM ZipCodes  z
 WHERE Zip = @zip OR (City LIKE '%'+@cityState+'%' and ((LEN(@cityState) > 2 AND State LIKE '%'+@cityState+'%' ) OR (State = @cityState))) 

 ORDER BY 
 CASE
    WHEN z.Zip = @zip THEN 1
    WHEN (City LIKE '%'+@cityState+'%' and ((LEN(@cityState) > 2 AND State LIKE '%'+@cityState+'%' ) OR (State = @cityState))) THEN 2
    WHEN State = @cityState+'%' THEN 3
    ELSE 4
 END,z.Zip,City,State
0 голосов
/ 26 ноября 2011

Попробуйте использовать UNION:

DECLARE @cityState nvarchar  = 'new york';
DECLARE @zip nvarchar  = '11204';

DECLARE @myposition geography;
SELECT * 
FROM ZipCodes  z
WHERE Zip LIKE @zip

UNION

SELECT * 
FROM ZipCodes  z
City LIKE @cityState+'%' 

UNION

SELECT * 
FROM ZipCodes  z
City LIKE @cityState+'%' 
0 голосов
/ 26 ноября 2011

Попробуйте:

ORDER BY CASE WHEN Z.ZIP like @zip THEN 1 ELSE 0 END DESC

РЕДАКТИРОВАТЬ: Мой ответ был неполным, так как не полностью прочитал вопрос.Ответ от gpeche лучше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...