ПРИВЕДЕНИЕ (somenumber как VARCHAR(10)) somestring возвращает ошибку преобразования типа данных varchar в числовой

#sql

#sql

Вопрос:

Я пытаюсь объединить минимальную и максимальную зарплату с дефисом для отображения в отчете. Мне кажется, что я делал это сто раз, но я все еще не могу понять, почему я получаю сообщение «Ошибка преобразования типа данных varchar в числовой», тем более, что я пытаюсь преобразовать числовое значение в varchar, а не наоборот.

 amt_exp_formatted = CASE
                       WHEN a.class_code IN ('9997','9998','9999') THEN 0 
                       --ELSE CAST(e.min_sal as VARCHAR(10))   '-'   CAST(e.max_sal as VARCHAR(10))                             
                         ELSE CONVERT(VARCHAR(1), 1)   CONVERT(VARCHAR(1), 'a')
                    END
  

В приведенном выше примере, если я использую ‘a’, я получаю ошибку. Если я изменю ‘a’ на ‘9’, тогда это сработает, И он добавит 9 к 1 (т.Е. 19), а не добавит их вместе, что именно то, что я хочу, но с символьной строкой. Я пробовал как ПРИВЕДЕНИЕ, так и ПРЕОБРАЗОВАНИЕ, но безуспешно. Я знаю, что мне не нужно второе ПРЕОБРАЗОВАНИЕ на букву «a», но я просто пытался заставить типы данных быть одинаковыми на всякий случай. Я нисколько не сомневаюсь, что мне не хватает чего-то простого, но, похоже, я не могу этого понять, поэтому я подумал, что не помешает спросить сообщество.

Спасибо!

Ответ №1:

case Выражение возвращает одно значение с определенным типом. Если какой-либо возвращенный fork возвращает число, то это число. И строки преобразуются.

Поэтому убедитесь, что вы возвращаете строку во всех случаях:

 (CASE WHEN a.class_code IN ('9997', '9998', '9999')
      THEN '0' 
      ELSE CONCAT(e.min_sal, '-', e.max_sal)  
 END)
  

CONCAT() автоматически преобразует аргументы в строки.

Комментарии:

1. Удаление одинарных кавычек вокруг 0 сработало сразу, так что спасибо! Я попробовал поискать в Google детерминированный, детерминированный тип и кодирование детерминированного типа, и все, что я получаю, — это куча информации о дженериках tomato, но позвольте мне посмотреть, смогу ли я понять. Вы говорите, что если одна из строк WHEN (или ELSE) возвращает значение с «числовым типом данных», то любая другая строка WHEN (или ELSE) будет преобразована в тот же «числовой тип», если она будет возвращена. Да?

2. @GunnerFan420 . . . Посмотрите приоритет типов в документации для любой используемой вами базы данных.

3. Ну, я просто предположу, что мое понимание правильное… спасибо вам. Приветствия!

Ответ №2:

Это связано с тем, что вы смешиваете тип данных. в первой части case вы возвращали 0, в то время как в другой части вы преобразуете его в varchar() . — вы можете попробовать следующее, возвращающее 0 также как varchar

 amt_exp_formatted = CASE
                       WHEN a.class_code IN ('9997','9998','9999') THEN '0' 
                       --ELSE CAST(e.min_sal as VARCHAR(10))   '-'   CAST(e.max_sal as VARCHAR(10))                             
                         ELSE CONVERT(VARCHAR(1), 1)   CONVERT(VARCHAR(1), 'a')
                    END
  

Комментарии:

1. большое вам спасибо за ваш ответ, и да, это отлично сработало для меня. Спасибо, сэр!