Последнее выражение WHEN переопределяет результат первого выражения WHEN в CASE WHEN в операторе SQL SELECT - PullRequest
0 голосов
/ 09 мая 2019

Это выглядит настолько знакомым большинству в этом сообществе, что все это о SQL CASE выражении.Но сейчас я собираюсь в режиме сортировки, а не в реальной реализации.Я ценю, если есть оптимальный способ обойти это.

СЦЕНАРИЙ:

У меня есть один оператор выбора, где я извлекаю несколько столбцов из таблицы.В таблице есть столбцы с типом данных numeric(10, 3).Я выбрал этот тип данных, так как подумал, что если мне нужно отобразить значение int, преобразование будет проще, а не наоборот.Вот структура таблицы.

Имя: FleetRange

Столбцы:

CaptionID INT NOT NULL 
Caption   NVARCHAR(50) 
FleetRange_1      numeric(10,3)
FleetRange_2_4    numeric(10,3)
.......
Total     numeric(10,3)

Критерии:

Текущий результат:

current query result

Мой SQL-запрос:

SELECT 
    CaptionId, Caption, 
    CASE 
       WHEN CaptionId IN (1, 2, 4, 5, 6, 7, 8, 9, 14, 15, 17, 18, 20, 21, 22, 23) 
          THEN CONVERT(INT, FleetRange_1)
       WHEN CaptionId IN (11, 12, 13) 
          THEN CONVERT(NUMERIC(10, 2), FleetRange_1)
       WHEN CaptionId IN (3, 10, 16, 19) 
          THEN CONVERT(NUMERIC(10, 3), FleetRange_1)
    END AS 'FleetRange_1'
FROM 
    FleetRange

ПРИМЕЧАНИЕ:

То, что происходит в данный момент, последнееWHEN отменяет предыдущую оценку, и, следовательно, каждая строка отображает значения с 3 decimal местами, даже если есть целочисленное значение.

Я применил такую ​​же структуру регистра для других numeric(10,3), поэтому я сократилзапрос.

вместо case, записанного в приведенном выше запросе, я тоже попробовал следующий синтаксис - но без разницы.

WHEN 
   CaptionId = 11 OR 
   CaptionId = 12 OR 
   CaptionId = 13 
  THEN...

Мой ожидание (желаемый фактический результат): моя цель - конкретное значение строки должно быть преобразовано в int numeric с заданной точностью, если вычисляется конкретное выражение when с конкретным CaptionID.

Примерно так:

CaptionID  | Caption         | FleetRange_1 | FleetRange_2_4 | .....
        1  | SafetyFirst     |            0 |              1 |
       11  | DriveSafe       |         2.15 |            null|
        3  | Caution         |        1.025 |           2.174|

1 Ответ

1 голос
/ 09 мая 2019

Каждое выражение в запросе имеет тип данных single .Тип данных выражения CASE:

самый высокий тип приоритета из набора типов в result_expressions и необязательном выражении else_result_expression.

CASE (TSQL)

И см. Приоритет типа данных

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...