#tsql #sql-order-by
#tsql #sql-order-by
Вопрос:
Я исследую набор данных.
И мне просто интересно, есть ли способ заказать, как показано ниже, в 1 запросе
Select * From MyTable where name ='international%' order by id
Select * From MyTable where name != 'international%' order by id
Итак, сначала отображаются все международные элементы, затем имена, которые не начинаются с international.
Мой вопрос не о добавлении столбцов, чтобы заставить это работать, или об использовании нескольких БД, или о более крупном скрипте CSQL для клонирования БД в новый порядок.
мне просто интересно, можно ли обмануть что-нибудь после ‘Where или order by‘, чтобы сделать это.
Ответ №1:
Вы можете использовать выражения в ORDER BY
:
Select * From MyTable
order by
CASE
WHEN name like 'international%' THEN 0
ELSE 1
END,
id
(Из вашего повествования это также звучало так, как вы хотели like
, нет =
, поэтому я тоже это изменил)
Комментарии:
1. На самом деле это отличный способ сделать это, потому что можно добавить несколько операторов Case, поэтому можно добавить несколько первых заказов (ea International, Europe, National, provincial, city, local)
Ответ №2:
Другой способ (немного чище и немного быстрее)
-- Sample Data
DECLARE @mytable TABLE (id INT IDENTITY, [name] VARCHAR(100));
INSERT @mytable([name])
VALUES('international something' ),('ACME'),('international waffles'),('ABC Co.');
-- solution
SELECT t.*
FROM @mytable AS t
ORDER BY -PATINDEX('international%', t.[name]);
Также обратите внимание, что вы можете добавить постоянный вычисляемый столбец для -PATINDEX('international%', t.[name])
ускорения процесса.
Комментарии:
1. также работает, но это не решение после «где»