Оператор case в SQL. Предложение Order By не работает со значениями varchar и int. - PullRequest
0 голосов
/ 06 ноября 2008

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

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, то он работает?

Ответы [ 2 ]

4 голосов
/ 30 апреля 2010

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

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

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

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

1 голос
/ 06 ноября 2008

Из Книг Онлайн:

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

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

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

...