Instruction Case en SQL Row_number () La clause Order By ne fonctionne pas sur les valeurs varchar et int
-
06-07-2019 - |
Question
Pourquoi cela ne fonctionne-t-il pas?
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
Mais si vous transmettez le ShipNo à un varchar dans l'instruction Case, cela fonctionne-t-il?
La solution
Je suis conscient du fait qu'il s'agit d'un ancien message, mais qu'il s'adresse à quiconque tombe sur cette question et cherche une solution:
SELECT ROW_NUMBER() OVER (ORDER BY
CASE @OrderBy
WHEN 'Supplier' THEN Supplier
END
CASE @OrderBy
WHEN 'ShipNo' THEN ShipNo
END
)
fondamentalement, vous mettez chaque champ dans son propre cas. Ne le faites que lorsque leur type de données ou leur valeur à l'intérieur du champ diffère pour les deux colonnes ou lorsque vous obtenez une erreur telle que
la conversion a échoué lors de la tentative de conversion de int en varchar ou de varchar en int.
Autres conseils
Dans la documentation en ligne:
CASE
WHEN Boolean_expression THEN result_expression
[ ...n ]
[
ELSE else_result_expression
]
END
"Les types de données de else_result_expression et de toute expression de resultat doivent être identiques ou doivent correspondre à une conversion implicite."
So Supplier et ShipNo doivent être du même type de données.