2017-01-31 10 views
2

Я наткнулся на предложение здесь (SQL: ORDER BY using a substring within a specific column... possible?), которое показывает оператор CASE, возвращающий целые числа внутри предложения ORDER BY в таблице с 4 столбцами.MSSQL - делает оператор CASE в ORDER BY возвратом столбцов столбцов?

SELECT npID, title, URL, issue 
FROM tbl 
ORDER BY substring(issue, 1, 4) DESC 
     ,CASE 
      WHEN substring(issue, 6, 100) IN ('Winter','First_Quarter') THEN 1 
      WHEN substring(issue, 6, 100) IN ('Summer','Second_Quarter') THEN 2 
      WHEN substring(issue, 6, 100) IN ('Spring','Third_Quarter') THEN 3 
      WHEN substring(issue, 6, 100) IN ('Fall', 'Fourth Quarter') THEN 4 
      ELSE 5 
     END; 

Я не понимаю, как это работает. Очевидно, что целые числа, являющиеся результатом CASE, НЕ являются столбцами (например, ELSE 5, так как таблица имеет только 4 столбца). Но что они означают? - Контекст заставляет его казаться, что они предназначены для использования THEMSELVES для заказа, но я никогда не видел таких вещей в ORDER BY. (Однако пример, приведенный в сообщении, работает, поэтому я действительно озадачен.) Может ли кто-нибудь объяснить, что значит возвращать целые числа внутри оператора CASE внутри предложения ORDER BY? Спасибо.

+1

'ORDER BY' принимает список столбцов по имени или порядку * или * выражение - как в вашем' CASE', которое оценивается для каждой строки в наборе результатов, каждая оценка возвращает целое число в диапазоне от 1 до 5 и это значение используется как ключ сортировки. –

+0

AlexK - Я до сих пор не понимаю. Вы говорите «порядковый номер или выражение». Как двигатель говорит разницу между порядковым номером (который, в конце концов, является выражением) и «выражением»? – user1693404

+1

Если его единственный целочисленный литерал, такой как '5', его порядковый номер - единственный способ указать один,' порядок 1 + 1'/'порядок by @ int_var' приведет к возникновению ошибок. –

ответ

2

Единственный раз, когда элемент в пункте ORDER BY считаются порядковым, когда его целым буквальным, глядя на стандарте SQL-92 мы можем видеть происхождение этого:

Если < сортировка > содержит < беззнаковое целое число >, то < беззнаковое целое число > должно быть больше 0 и не больше степени T.Спецификация сортировки < идентифицирует столбец T с порядковым положением, указанным целым числом без знака < >.

Если предложение ORDER BY содержит непостоянное выражение скаляра, такие как CASE то результат этого выражения используется в качестве ключа сортировки, то есть, если он вычисляет строку в наборе результатов и возвращает целое число п это значение n, которое сортируется.

1

Целочисленные значения, представленные в заявке CASE, не являются порядковыми номерами столбцов, которые являются статическими значениями Integer, которые будут использоваться для упорядочивания результата.

После упорядочения записей по substring(issue, 1, 4) DESC,

когда substring(issue, 6, 100) является 'Winter' или 'First_Quarter' то он будет отсортирован первым,

когда substring(issue, 6, 100) является 'Summer' или 'Second_Quarter' то будет сортировать после 'Winter' или 'First_Quarter'

и т. д.

Для олучатель понимания вы можете выбрать дело и увидеть результат

SELECT npID, title, URL, issue,CASE 
      WHEN substring(issue, 6, 100) IN ('Winter','First_Quarter') THEN 1 
      WHEN substring(issue, 6, 100) IN ('Summer','Second_Quarter') THEN 2 
      WHEN substring(issue, 6, 100) IN ('Spring','Third_Quarter') THEN 3 
      WHEN substring(issue, 6, 100) IN ('Fall', 'Fourth Quarter') THEN 4 
      ELSE 5 
     END 
FROM tbl 
ORDER BY substring(issue, 1, 4) DESC 
     ,CASE 
      WHEN substring(issue, 6, 100) IN ('Winter','First_Quarter') THEN 1 
      WHEN substring(issue, 6, 100) IN ('Summer','Second_Quarter') THEN 2 
      WHEN substring(issue, 6, 100) IN ('Spring','Third_Quarter') THEN 3 
      WHEN substring(issue, 6, 100) IN ('Fall', 'Fourth Quarter') THEN 4 
      ELSE 5 
     END; 
+0

Я как бы вижу, что ДОЛЖНО продолжаться, но где это документировано? Я думал, что результат CASE просто помещается в запрос, поэтому у вас будет что-то вроде ORDER BY xyz, 3 означает порядок в столбце с именем xyz, а затем порядок на третьем результирующем столбце. С каких пор вы можете просто выбросить значение, как если бы оно было помещено в столбец? Это просто особый способ CASE работает внутри ORDER BY? Почему это не документируется везде, где объясняется CASE? – user1693404

+1

Документировано; https://msdn.microsoft.com/en-us/library/ms188385.aspx#Case –

+0

Кроме того, я видел другие примеры, в которых оператор CASE выводит имя столбца - очевидно, в этой ситуации смысл заключается в том, что результат должен обрабатываться так, как если бы имя столбца просто появилось в ORDER BY. Почему это специальное лечение целых чисел? Разве не было бы более целесообразным поместить целое число в столбец в SELECT, а затем упорядочить его в этом столбце? – user1693404

0

делает саз в ORDER BY возвратного пункта порядковых столбцов?

No.

Ниже заявление изменяет порядок, в котором значения появляются в этом столбце только

CASE 
      WHEN substring(issue, 6, 100) IN ('Winter','First_Quarter') THEN 1 
      WHEN substring(issue, 6, 100) IN ('Summer','Second_Quarter') THEN 2 
      WHEN substring(issue, 6, 100) IN ('Spring','Third_Quarter') THEN 3 
      WHEN substring(issue, 6, 100) IN ('Fall', 'Fourth Quarter') THEN 4 
      ELSE 5 
     END;*emphasized text* 
+0

Я не понимаю. В столбце WHAT только ?? – user1693404

1

Эти числа не являются колонки числительные, но значение литералов. Запрос сначала сортируется по первым четырем символам столбца issue (представляющий год). Затем они упорядочиваются по второстепенному ключу, представленному выражением case. Значения, используемые там, не являются интересными сами по себе, важно только относительный порядок между ними. Например, 2, рассчитанный для летних выпусков, не имеет смысла - только то, что оно приходит после зимы (рассчитано как 1) и до весны (рассчитано как 3). Вместо этого запрос мог бы использовать «a», «b», «c», «d» и «e» и получить тот же результат.

+0

Спасибо, да, я вижу, что происходит. Я просто в шоке. Я имею в виду, почему CASE работает в ORDER BY одним способом, если он возвращает целое число и другой способ, если он возвращает имя столбца? ESPECIALLY, так как «normaly» целое число в ORDER BY имеет смысл - это означает порядковый номер столбца. Я не сомневаюсь - спрашиваю, где это документировано?И означает ли это, что я НЕ МОГУ использовать CASE в ORDER BY, чтобы вернуть порядковый номер столбца, если захочу? – user1693404

+1

'case' ** always ** возвращает значение. Когда он возвращает столбец, это означает, что он возвращает значение ** **, которое имеет эта строка для этого столбца. – Mureinik

+0

Я не думаю, что вы понимаете, почему я озадачен. Я согласен, что это классный способ установить порядок - я просто не понимаю, как CASE можно использовать как это - разве это не совсем отличается от того, как работает CASE? – user1693404

 Смежные вопросы

  • Нет связанных вопросов^_^