Подтвердить что ты не робот

TSQL - Можно ли определить порядок сортировки?

Можно ли определить порядок сортировки для возвращаемых результатов?

Я хотел бы, чтобы порядок сортировки был "оранжевым" яблочным "клубничным" не восходящим или нисходящим.

Я знаю, что ORDER BY может делать ASC или DESC, но есть ли ОПРЕДЕЛЕННАЯ ( "оранжевая", "яблочная", "клубничная" ) вещь?

Это будет работать на SQL Server 2000.

4b9b3361

Ответ 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