SQLのCaseステートメント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

しかし、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は同じデータ型でなければなりません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top