TSQL - Можно ли определить порядок сортировки?
Можно ли определить порядок сортировки для возвращаемых результатов?
Я хотел бы, чтобы порядок сортировки был "оранжевым" яблочным "клубничным" не восходящим или нисходящим.
Я знаю, что ORDER BY может делать ASC или DESC, но есть ли ОПРЕДЕЛЕННАЯ ( "оранжевая", "яблочная", "клубничная" ) вещь?
Это будет работать на SQL Server 2000.
Ответы
Ответ 1
Это невероятно неуклюже, но вы можете использовать оператор CASE для заказа:
SELECT * FROM Blah
ORDER BY CASE MyColumn
WHEN 'orange' THEN 1
WHEN 'apple' THEN 2
WHEN 'strawberry' THEN 3
END
В качестве альтернативы вы можете создать вторичную таблицу, содержащую поле сортировки и порядок сортировки.
TargetValue SortOrder
orange 1
apple 2
strawberry 3
И присоедините свою таблицу к этой новой таблице.
Ответ 2
Используйте оператор CASE:
ORDER BY CASE your_col
WHEN 'orange' THEN 1
WHEN 'apple' THEN 2
WHEN 'strawberry' THEN 3
END
Альтернативный синтаксис с ELSE:
ORDER BY CASE
WHEN your_col = 'orange' THEN 1
WHEN your_col = 'apple' THEN 2
WHEN your_col = 'strawberry' THEN 3
ELSE 4
END
Ответ 3
Если это будет непродолжительное требование, используйте оператор case. Однако, если вы думаете, что это может быть вокруг какое-то время, и это всегда будет orange/apple/strawberry
order (или даже если нет - см. Ниже), вы можете подумать о том, чтобы пожертвовать некоторым дисковым пространством, чтобы получить некоторую скорость.
Создайте новый столбец в таблице с именем or_ap_st
и используйте триггер insert/update, чтобы заполнить его числом 1, 2 или 3 в зависимости от значения столбца фруктов. Затем проиндексируйте его.
Так как единственный раз, когда данные в этом столбце будут меняться, это когда строка изменяется, это лучшее время для ее выполнения. Затем стоимость будет понесена на небольшом количестве записей, а не на большом количестве чтений, поэтому амортизируется над операторами select
.
Затем ваш запрос будет ослепительно быстрым:
select field1, field2 from table1
order by or_ap_st;
без каких-либо функций строки, убивающих производительность.
И если вам нужны другие порядки сортировки, ну, вот почему я назвал столбец or_ap_st
. Вы можете добавить столько столбцов сортировки, сколько вам нужно.
Ответ 4
В этом случае я делаю
ORDER BY
CASE WHEN FRUIT = 'Orange' THEN 'A'
WHEN FRUIT = 'Apple' THEN 'B'
WHEN FRUIT = 'Strawberry' THEN 'C'
ELSE FRUIT
END
Ответ 5
Идем дальше из turtlepick answer:
ORDER BY
CASE WHEN FRUIT = 'Orange' THEN 'A'
WHEN FRUIT = 'Apple' THEN 'B'
WHEN FRUIT = 'Strawberry' THEN 'C'
ELSE FRUIT
END
Если у вас есть еще несколько предметов в FRUIT, и они начинаются с букв, определенных после ключевых слов THEN, эти элементы появятся в жестком порядке. Например, Банана появляется перед Клубникой. Вы можете обойти его с помощью
ORDER BY
CASE
WHEN FRUIT = 'Orange' THEN '.1'
WHEN FRUIT = 'Apple' THEN '.2'
WHEN FRUIT = 'Strawberry' THEN '.3'
ELSE FRUIT
END
Здесь я использовал символы с более низкими значениями ASCII в надежде, что они не появятся в начале значений в FRUIT.
Ответ 6
Добавить ключ в таблицу (например, primary_id int identity (1,1) primary key), чтобы сохранить порядок вставки
create table fruit(fruit_id int identity(1,1) primary key, name varchar(50))
go
insert into fruit(name) values ('orange')
insert into fruit(name) values ('apple')
insert into fruit(name) values ('strawberry')
select name from fruit
результат:
orange
apple
strawberry
Ответ 7
Не так часто, но для операций с одним значением или конкретных шаблонов, REPLACE работает тоже
например.
DECLARE @Fruit TABLE (Fruit_Id INT IDENTITY(1, 1) PRIMARY KEY ,Name VARCHAR(50));
INSERT INTO @Fruit (Name) VALUES ('Orange');
INSERT INTO @Fruit (Name) VALUES ('Apple');
INSERT INTO @Fruit (Name) VALUES ('Strawberry');
INSERT INTO @Fruit (Name) VALUES ('__Pear');
SELECT * FROM @Fruit AS f
ORDER BY REPLACE(f.Name,'__','')
Fruit_Id Name
----------- --------------------------------------------------
2 Apple
1 Orange
4 __Pear
3 Strawberry