2012-01-20 14 views
8

Tengo un procedimiento almacenado que utiliza la cláusula IN. En mi aplicación ASP.NET, tengo un cuadro de texto de líneas múltiples que proporciona valores al procedimiento almacenado. Quiero poder ordenar por los valores tal como se ingresaron en el cuadro de texto. Descubrí cómo hacer esto fácilmente en mySQL (usando la función FIELD), pero no en un SQL Server equivalente.Ordenar resultados de SQL Server por la cláusula IN

Así que mi pregunta es así:

Select * from myTable where item in @item 

por lo que sería de aprobado en los valores de mi aplicación como '113113', '112112', '114114' (en un orden arbitrario). Quiero ordenar los resultados por esa lista.

¿Sería factible una declaración CASE? No sabría cuántos elementos vienen en los datos del cuadro de texto.

Respuesta

5

¿Cómo está parametrizando la cláusula IN?

Como está en SQL Server 2008, pasaría en un Table Valued Parameter con dos columnas item y sort_order y me uniría a eso en su lugar. Luego puede agregar un ORDER BY sort_order al final.

+2

+1, o si por csv, divida en una variable @table con una columna de identidad a la que puede unir y luego ordene por –

+0

@KM entonces OP necesita escribir un procedimiento de tienda para una simple selección –

+0

@LuisSiquot - They ya están usando un procedimiento almacenado. Pero deberían usar consultas parametrizadas incluso si no lo fueran. Hay un montón de funciones de tabla dividida que operan como lo sugiere KM a las que el OP podría unirse, pero si no se necesita compatibilidad con el 2005, los TVP serán mejores. –

1

la misma manera concatena ('113113', '112112', '114114') para pasar a la sentencia SQL en el dónde Cláusula puede concatenar

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

para pasar a su orden por cláusula de

+0

No es posible, él no sabe cuántos valores habrá; su declaración de caso podría ser de 1 a n, donde n es realmente realmente muy alto. – JonH

+0

@JonH quizás él sepa cuántos valores habrá. Por supuesto, esta solución es para n casos finitos y "lógicos". OP puede evaluar si un poco n se ajusta a sus necesidades. Asegúrese de que si esto es para un problema de presentación, n cubre todos los casos lógicos. –

+0

Estoy de acuerdo con usted, sin embargo, mencionó que no sabe cuántos. De ahí mi comentario. – JonH

2

Desde el comentario de kilómetros por encima de ...

yo sé que no es estado en el que coma seperated, pero si se trataba de un CSV o incluso si lo tienes espacio separados que podría hacer lo siguiente.

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 

y luego crear 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 

De esta manera su función crea una tabla que tiene un orden de clasificación a saber, SortOrder y el ID o el número que está de paso en Por supuesto, puede modificar esto. para que esté buscando espacio en lugar de , valores. De lo contrario, Martin tiene la idea correcta en su respuesta. Tenga en cuenta que en mi ejemplo estoy usando una de mis tablas, por lo que tendrá que cambiar el nombre Login a lo que sea que esté tratando.

+0

+1, demasiado flojo/ocupado para contestarme ... –

Cuestiones relacionadas