2012-01-20 11 views
8

Ho una stored procedure che utilizza la clausola IN. Nella mia applicazione ASP.NET, ho una casella di testo multilinea che fornisce i valori alla stored procedure. Voglio essere in grado di ordinare in base ai valori come sono stati inseriti nella casella di testo. Ho scoperto come farlo facilmente in mySQL (usando la funzione FIELD), ma non un equivalente di SQL Server.Ordinamento dei risultati di SQL Server in base alla clausola IN

Quindi la mia domanda si presenta come:

Select * from myTable where item in @item 

Così mi sarebbe passato nei valori dalla mia applicazione come '113.113', '112112', '114114' (in un ordine arbitrario). Voglio ordinare i risultati da quella lista.

Sarebbe possibile una dichiarazione CASE? Non saprei quanti oggetti stanno arrivando nei dati della casella di testo.

risposta

5

Come si parametrizza la clausola IN?

Dato che ci si trova su SQL Server 2008, passarei un Table Valued Parameter con due colonne item e sort_order e ci parteciperei. Quindi puoi semplicemente aggiungere un ORDER BY sort_order alla fine.

+2

+1 o se con csv, dividere in una variabile @table con una colonna di identità a cui è possibile partecipare e quindi ordinare per –

+0

@KM in modo che OP debba scrivere una procedura di archiviazione per una semplice selezione –

+0

@LuisSiquot - Loro stanno già utilizzando una stored procedure. Ma dovrebbero usare query parametrizzate anche se non lo fossero. Ci sono un sacco di funzioni valutate su split table che funzionano come suggerito da KM a cui l'OP potrebbe aderire, ma se la compatibilità del 2005 non è necessaria, i TVP saranno migliori. –

1

allo stesso modo in cui si concatenare ('113.113', '112112', '114114') per passare alla frase SQL nel quale clausule è possibile concatenare

order by 
case item  
when '113113' then 1 
when '112112' then 2 
when '114114' then 3 
end 

di passare al vostro ordine per clausule

+0

Non è possibile che non sappia quanti valori ci saranno - la tua dichiarazione del caso potrebbe essere da 1 a n dove n è veramente veramente alto. – JonH

+0

@JonH forse sa quanti valori ci saranno. Ovviamente questa soluzione è per un caso finito e "logico". OP può valutare se un po 'n corrisponde alle sue esigenze. Assicurarsi che se questo è per un problema di presentazione n copre tutti i casi logici. –

+0

Sono d'accordo con te, comunque ha detto che non sa quanti. Quindi il mio commento. – JonH

2

Dal commento di KM sopra ...

so che non ha precisato che è separati da virgola, ma se fosse un file CSV o anche se lo avete spazio separato che si possa fare quanto segue.

DECLARE @SomeTest varchar(100) --used to hold your values 
SET @SomeTest = (SELECT '68,72,103') --just some test data 

SELECT 
    LoginID --change to your column names 
FROM 
    Login --change to your source table name 
INNER JOIN 
( SELECT 
    * 
    FROM fn_IntegerInList(@SomeTest) 
) n 
ON 
    n.InListID = Login.LoginID 
ORDER BY 
    n.SortOrder 

e quindi creare fn_IntegerInList():

CREATE FUNCTION [dbo].[fn_IntegerInList] (@InListString ntext) 
RETURNS @tblINList TABLE (InListID int, SortOrder int) 
AS 
BEGIN 
declare @length int 
declare @startpos int 
declare @ctr int 
declare @val nvarchar(50) 
declare @subs nvarchar(50) 
declare @sort int 

set @sort=1 
set @startpos = 1 
set @ctr = 1 
select @length = datalength(@InListString) 

while (@ctr <= @length) 
begin 
    select @val = substring(@InListString,@ctr,1) 

    if @val = N',' 
    begin 
     select @subs = substring(@InListString,@startpos,@[email protected]) 
     insert into @tblINList values (@subs, @sort) 
     set @startpos = @ctr+1 
    end 
    if @ctr = @length 
     begin 
     select @subs = substring(@InListString,@startpos,@[email protected]) 
     insert into @tblINList values (@subs, @sort) 
     end 
    set @ctr = @ctr +1 
    set @sort = @sort + 1 
end 
RETURN 
END 

In questo modo la funzione crea una tabella che contiene un tipo di ordinamento e cioè, SortOrder e l'ID o il numero che si sta passando in Naturalmente, è possibile modificare questo. in modo che si cerchi lo spazio anziché i valori ,. Altrimenti, Martin ha la giusta idea nella sua risposta. Si prega di notare nel mio esempio che sto usando uno dei miei tavoli, quindi sarà necessario modificare il nome Login per qualsiasi cosa si tratti.

+0

+1, troppo pigro/occupato per rispondere a me stesso ... –

Problemi correlati