Оператор case в SQL Row_number () Предложение Order By не работает со значениями varchar и int

StackOverflow https://stackoverflow.com/questions/268322

Вопрос

Почему это не работает?

DECLARE @temp table
(ShipNo int,
 Supplier varchar(10)
)

INSERT INTO @temp VALUES (1,'CFA')
INSERT INTO @temp VALUES (1, 'TFA')
INSERT INTO @temp VALUES (2, 'LRA')
INSERT INTO @temp VALUES (2, 'LRB')
INSERT INTO @temp VALUES (3, 'ABC')
INSERT INTO @temp VALUES (4, 'TFA')

Declare @OrderBy varchar(255)
sET @OrderBy = 'Supplier'



SELECT ROW_NUMBER() OVER (ORDER BY 
CASE @OrderBy
 WHEN 'Supplier' THEN Supplier
 WHEN 'ShipNo' THEN ShipNo
END
) AS RowNo,
ShipNo,
Supplier
FROM @temp

Но если вы приведете ShipNo к varchar в операторе Case, он работает?

Это было полезно?

Решение

Я знаю, что это старый пост, но он предназначен для любого, кто сталкивается с этой проблемой и ищет решение:

SELECT ROW_NUMBER() OVER (ORDER BY  
CASE @OrderBy 
 WHEN 'Supplier' THEN Supplier
END
CASE @OrderBy
 WHEN 'ShipNo' THEN ShipNo 
END 
)

В основном вы помещаете каждое поле в отдельный регистр. Делайте это только тогда, когда их тип данных или значение внутри поля различаются для обоих столбцов или когда вы получаете сообщение об ошибке, например

преобразование не удалось при попытке преобразовать int в varchar или varchar в int ..

Другие советы

Из книг в Интернете:

CASE
WHEN Boolean_expression THEN result_expression 
    [ ...n ] 
[ 
    ELSE else_result_expression 
] 
END

" Типы данных else_result_expression и любого result_expression должны быть одинаковыми или неявным преобразованием. "

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top