Оператор UNPIVOT стр. 2 |
|||||||||||||||||||||||||||||||||||||||||||||
Пусть нам требуется повернуть строку, содержащую NULL-значение в одном из столбцов. Т.е. вместо результата
Применим оператор UNPIVOT:
Первая неожиданность - ошибка компиляции: Тип столбца "c" конфликтует с типами других столбцов, указанных в списке UNPIVOT. Это означает, что сервер неявно не преобразовал тип столбца "с", содержащий NULL, к типу первых двух столбцов, которые могут быть оценены как целочисленные. Давайте сделаем это явно:
Вторая неожиданность - оказывается UNPIVOT игнорирует NULL-значения, не выводя их в результирующем наборе. Первое, что приходит в голову всем, это заменить NULL каким-нибудь валидным значением, заведомо отсутствующим в столбце. Если, в соответствии с ограничениями предметной области, значения с не могут быть отрицательными, заменим NULL на -1:
Остался последний шаг, о котором многие забывают, решая задачи на сайте sql-ex.ru. А именно, обратное преобразование. Вместо этого пытаются подобрать такое значение, которое позволило бы "удовлетворить" систему проверки. Иногда это получается, например, если сравнение NULL и '' (пустой строки) оценивается на сайте как true. Но понятно, что на это полагаться не стоит. Итак, обратное пребразование:
Здесь как нельзя более кстати пришлась функция NULLIF.
|