Чем функция MS SQL Server похожа на функцию MySQL FIELD ()?

13

MySQL предоставляет строчную функцию с именем FIELD(), которая принимает переменное количество аргументов. Возвращаемое значение - это местоположение первого аргумента в списке остальных. Другими словами:

FIELD('d', 'a', 'b', 'c', 'd', 'e', 'f')

будет возвращать 4, так как "d" является четвертым аргументом, следующим за первым.

Эта функция предоставляет возможность сортировать результаты запроса на основе очень специфического заказа. Для моего текущего приложения есть четыре статуса, которые мне нужно для менеджера: активные, одобренные, отклоненные и отправленные. Однако, если я просто закажу столбцом статуса, я считаю, что удобство использования результирующего списка уменьшается, поскольку отклоненные и активные статусные элементы более важны, чем представленные и одобренные.

В MySQL я мог бы сделать это:

SELECT <stuff> FROM <table> WHERE <conditions> ORDER BY FIELD(status, 'rejected', 'active','submitted', 'approved')

и результаты будут упорядочены так, чтобы сначала были отклоненные элементы, затем активные и т.д. Таким образом, результаты были упорядочены в снижении уровня важности для посетителя.

Я мог бы создать отдельную таблицу, которая перечисляет этот уровень важности для статусов, а затем заказывает запрос по убыванию, но это несколько раз появилось для меня с момента перехода на MS SQL Server, поэтому я подумал, что спросите, можно ли избежать дополнительной таблицы и несколько более сложных запросов, используя встроенную функцию, похожую на MySQL FIELD().

Спасибо,
Дэвид Кис

Теги:
sql-server
tsql
sql-order-by

2 ответа

19
Лучший ответ

Используйте выражение CASE (SQL Server 2005 +):

ORDER BY CASE status
           WHEN 'active' THEN 1
           WHEN 'approved' THEN 2
           WHEN 'rejected' THEN 3
           WHEN 'submitted' THEN 4
           ELSE 5
         END

Этот синтаксис можно использовать для более сложной оценки (включая комбинации, или если вам нужно использовать LIKE)

ORDER BY CASE 
           WHEN status LIKE 'active' THEN 1
           WHEN status LIKE 'approved' THEN 2
           WHEN status LIKE 'rejected' THEN 3
           WHEN status LIKE 'submitted' THEN 4
           ELSE 5
         END
  • 0
    Потрясающие вещи! Благодарю.
0

Я рекомендую CTE (SQL Server 2005+). Не нужно повторять коды состояния или создавать отдельную таблицу.

WITH cte(status, RN) AS (  -- CTE to create ordered list and define where clause
      SELECT 'active', 1
UNION SELECT 'approved', 2
UNION SELECT 'rejected', 3
UNION SELECT 'submitted', 4
)
SELECT <field1>, <field2>
FROM <table> tbl
INNER JOIN cte ON cte.status = tbl.status  -- do the join
ORDER BY cte.RN  -- use the ordering defined in the cte

Удачи,

Джейсон

Ещё вопросы

Сообщество Overcoder
Наверх
Меню