Istruzione case in SQL Row_number () Clausola Order By non funzionante sui valori varchar e int

StackOverflow https://stackoverflow.com/questions/268322

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?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top