Оператор case в SQL Row_number () Предложение Order By не работает со значениями varchar и int
-
06-07-2019 - |
Вопрос
Почему это не работает?
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 должны быть одинаковыми или неявным преобразованием. "
Таким образом, у поставщика и отправителя должны быть одинаковые типы данных.