Istruzione case in SQL Row_number () Clausola Order By non funzionante sui valori varchar e int
-
06-07-2019 - |
Domanda
Perché non funziona?
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
Ma se si lancia ShipNo su un varchar nell'istruzione Case, FUNZIONA?
Soluzione
Sono consapevole che questo è un vecchio post, ma questo è per chiunque si occupi di questo problema e stia cercando una soluzione:
SELECT ROW_NUMBER() OVER (ORDER BY
CASE @OrderBy
WHEN 'Supplier' THEN Supplier
END
CASE @OrderBy
WHEN 'ShipNo' THEN ShipNo
END
)
praticamente stai mettendo ogni campo nel suo caso. Fallo solo quando il loro tipo di dati o valore all'interno del campo differisce per entrambe le colonne o quando ricevi un errore come
conversione non riuscita durante il tentativo di convertire int in varchar o varchar in int ..
Altri suggerimenti
Dalla documentazione online:
CASE
WHEN Boolean_expression THEN result_expression
[ ...n ]
[
ELSE else_result_expression
]
END
" I tipi di dati di else_result_expression e qualsiasi risultato_expression devono essere uguali o devono essere una conversione implicita. "
Quindi Supplier e ShipNo devono avere lo stesso tipo di dati.