ORDER BY с относительными данными для конкретного ключевого слова - PullRequest
0 голосов
/ 08 июня 2018
SELECT 
    Users.user_id, Users.location, Profession.name
FROM 
    Users
FULL OUTER JOIN 
    User_Education ON Users.user_id = User_Education.user_id
INNER JOIN 
    Profession ON Profession.profession_id = Users.desired_job
FULL OUTER JOIN 
    Exp_Duration ON Exp_Duration.user_id = Users.user_id
FULL OUTER JOIN 
    User_Skill ON Users.user_id = User_Skill.user_id
WHERE 
    1 = 1 
    AND Users.user_id IN (1491, 1493, 1497, 1498)           
    AND Users.active = 1 

Я пытаюсь упорядочить результаты, полученные по этому запросу, для сопоставления с ключевым словом.Например, я хочу иметь возможность перейти к «инженеру-программисту» и увидеть, что пользователи с активной записью в таблице «Профессия» оказались сверху.Какой самый эффективный способ добиться этого?

Вот один из многих неудачных методов, которые я использовал:

SELECT 
    Users.user_id, Users.location, Profession.name
FROM 
    Users
FULL OUTER JOIN 
    User_Education ON Users.user_id = User_Education.user_id
INNER JOIN 
    Profession ON Profession.profession_id = Users.desired_job
FULL OUTER JOIN 
    Exp_Duration ON Exp_Duration.user_id = Users.user_id
FULL OUTER JOIN 
    User_Skill ON Users.user_id = User_Skill.user_id
WHERE 
    1 = 1 
    AND Users.user_id IN (1491, 1493, 1497, 1498, 1503)           
    AND Users.active = 1 
ORDER BY 
    CASE
       WHEN Profession.name LIKE 'Software Engineer' 
          THEN 0 
          ELSE 1
    END, Profession.name ASC

Ответы [ 4 ]

0 голосов
/ 08 июня 2018

Нет никакого смысла для like, если вы не используете какие-либо подстановочные знаки.

У вас есть что-то еще, так как это прекрасно работает для меня.

declare @t table (p varchar(40));
insert @t values 
('cook'),
('cook'),
('cook'),
('engineer'),
('engineer'),
('engineer'),
('engineer'),
('cook'),
('mechanic'),
('mechanic');
select * 
from @t 
order by case when p = 'engineer' 
                   then 0
                   else 1
         end, 
         p;

engineer
engineer
engineer
engineer
cook
cook
cook
cook
mechanic
mechanic
0 голосов
/ 08 июня 2018

Микширование full join и inner join просто выглядит неправильно.На самом деле, я почти никогда не использую full join.Фактически, большинство таблиц в запросе не используются в запросе.

Вы, похоже, хотите сохранить всех пользователей, поэтому я подозреваю, что это запрос, который вы хотите:

SELECT u.user_id, u.location, p.name
FROM Users u LEFT JOIN
     Profession p
     ON p.profession_id = u.desired_job
WHERE u.user_id IN (1491, 1493, 1497, 1498) AND         
      u.active = 1 
ORDER BY (CASE WHEN p.name LIKE '%Software Engineer%' THEN 1 ELSE 2 END),
         u.user_id;

Если вам нужны другие таблицы (скажем, для ссылок на столбцы, удаленные из этого запроса), тогда используйте LEFT JOIN.

0 голосов
/ 08 июня 2018

Пожалуйста, попробуйте это:

DECLARE @keyword NVARCHAR(256) = N'Software Engineer'; 
***
ORDER BY  
     IIF([Profession].[name] LIKE '%' + @keyword + '%', NULL, '') ASC
    ,[Profession].[name] ASC;
0 голосов
/ 08 июня 2018

Пожалуйста, замените

Profession.name LIKE 'Software Engineer' 

на

Profession.name LIKE ('%' + 'Software Engineer' + '%')

и протестируйте его.

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