SQLのCaseステートメント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
しかし、CaseステートメントでShipNoをvarcharにキャストすると、動作しますか?
解決
これは古い投稿であることは承知していますが、これはこの問題に出くわして解決策を探している人向けです:
SELECT ROW_NUMBER() OVER (ORDER BY
CASE @OrderBy
WHEN 'Supplier' THEN Supplier
END
CASE @OrderBy
WHEN 'ShipNo' THEN ShipNo
END
)
基本的には、各フィールドを独自のケースに入れています。これは、フィールド内のデータ型または値が両方の列で異なる場合、または次のようなエラーが発生している場合にのみ行います。
intをvarcharに、またはvarcharをintに変換しようとしたときに、変換が失敗しました。
他のヒント
Books Onlineから:
CASE
WHEN Boolean_expression THEN result_expression
[ ...n ]
[
ELSE else_result_expression
]
END
" else_result_expressionとすべてのresult_expressionのデータ型は同じであるか、暗黙的な変換である必要があります。"
したがって、SupplierとShipNoは同じデータ型でなければなりません。
所属していません StackOverflow