2017-01-13 4 views
2
Select CASE WHEN loc ='J' THEN 'Y' 
      WHEN loc NOT IN ('J') THEN 'N' 
      ELSE 0 END AS loc FROM [prd].[dbo].[GRP] 
      EXCEPT 
Select location FROM [prd1].[dbo].[GRPO] WHERE VALUE IN('Y','N'); 

Ошибки:саз В SQL

Conversion failed when converting the varchar value 'Y' to data type int.

как столбцы в обеих таблицах, являются только типа (varchar) же данными.

+0

Это 'ELSE 0', что дает вашей проблемы. Перейдите на 'ELSE '0'', чтобы исправить ошибку. – HoneyBadger

+1

Это потому, что ваш else является int, поэтому он будет делать неявное преобразование всего в int, потому что все значения должны быть одного и того же типа данных. Почему бы просто не удалить другое? Вы все равно не можете добраться до этого кода. –

+1

@SeanLange, вы достигаете 'ELSE', если' loc IS NULL' – HoneyBadger

ответ

5

Оператор Case возвращает наивысший тип приоритета из набора типов в result_expressions и необязательном else_result_expression. Поскольку 0 (INT) имеет более высокий приоритет, чем Y (Varchar), Y неявно преобразован в INT, поэтому вы получаете ошибку преобразования.

Изменение 0 (INT) в '0' (String) в ELSE заявлении

Select CASE WHEN loc = 'J' THEN 'Y' 
      WHEN loc <> 'J' THEN 'N' -- loc NOT IN ('J') 
ELSE '0' END 
+0

Вы даже не можете добраться до другого из логики OPs. Нет значений, в которых вы либо = 'J', либо нет = 'J'. :) –

+0

@SeanLange -Что если это 'NULL' –

+0

хорошая точка ... duh. Мне нужно взять еще кофе. –