Использование SUM в CASE, если значение является числовым - PullRequest
0 голосов
/ 09 июля 2019

У меня ситуация, аналогичная известной проблеме в предложении CASE:

DECLARE @i INT = 1;
SELECT CASE WHEN @i = 1 THEN 1 ELSE MIN(1/0) END;

В этом случае код выдаст исключение Divide by zero error encountered, хотя в теории вы никогда не достигнете этогоmin(1/0) сценарий.

Итак, у меня похожая ситуация:

CASE WHEN CodeValue in ('Numeric1','Numeric2') THEN SUM(cast(VarcharValue as int)) ELSE max(VarcharValue) END

Другими словами, мне нужно использовать функцию SUM, если VarcharValue числовое (это можно определить с помощью CodeValue если оно числовое), если это не так, мне нужно вернуть VarcharValue с функцией MAX.

Есть предложения?

1 Ответ

1 голос
/ 09 июля 2019

У вас странная конструкция, потому что одна ветвь case возвращает строку, а другая - число.В таком случае SQL Server решает, что выражение возвращает число.

И у вас будут проблемы с ELSE, потому что нечисловая строка будет преобразована в число.Ошибка.

Следующие могут работать:

(CASE WHEN CodeValue in ('Numeric1', 'Numeric2') 
      THEN CAST(VARCHAR(MAX), SUM(CAST(VarcharValue as int)))
      ELSE MAX(VarcharValue)
 END)

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

(CASE WHEN CodeValue in ('Numeric1', 'Numeric2') 
      THEN CAST(VARCHAR(MAX), SUM(TRY_CAST(VarcharValue as int)))
      ELSE MAX(VarcharValue)
 END)

Однако вы можете повторить логику CASE:

(CASE WHEN CodeValue in ('Numeric1', 'Numeric2') 
      THEN CAST(VARCHAR(MAX), SUM(CASE WHEN CodeValue in ('Numeric1', 'Numeric2')  THEN CAST(VarcharValue as int) END))
      ELSE MAX(VarcharValue)
 END)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...