2009-06-23 12 views
7

estoy usando una instrucción SELECT en T-SQL en una tabla similar a la siguiente:SQL: Los valores de uso múltiples en una sola instrucción SELECT

SELECT DISTINCT name, location_id, application_id FROM apps 
WHERE ((application_id is null) or (application_id = '4')) 
AND ((location_id is null) or (location_id = '3')) 

Esto parece funcionar bien en la búsqueda de uno o uno application_id location_id , pero ¿y si quiero ejecutar la declaración para múltiples ubicaciones? Deseo devolver todos los resultados por una cantidad desconocida de location_id y application_id. Por ejemplo, si quería buscar a alguien en location_id's 2, 3, 4, 5 pero con solo un application_id. ¿Cómo haría esto?

¡Gracias de antemano!


EDIT: que soy un idiota! Lo hice sonar fácil sin darte todos los detalles. Todos estos valores se dan desde el interior de una tabla. El usuario deberá elegir los ID de una columna en la tabla en lugar de insertarlos. Después de hacer un poco de investigación sobre este problema, yo came up with a page que parecía proponer una solución viable.

CREATE FUNCTION iter$simple_intlist_to_tbl (@list nvarchar(MAX)) 
    RETURNS @tbl TABLE (number int NOT NULL) AS 
BEGIN 
    DECLARE @pos  int, 
      @nextpos int, 
      @valuelen int 

    SELECT @pos = 0, @nextpos = 1 

    WHILE @nextpos > 0 
    BEGIN 
     SELECT @nextpos = charindex(',', @list, @pos + 1) 
     SELECT @valuelen = CASE WHEN @nextpos > 0 
           THEN @nextpos 
           ELSE len(@list) + 1 
         END - @pos - 1 
     INSERT @tbl (number) 
     VALUES (convert(int, substring(@list, @pos + 1, @valuelen))) 
     SELECT @pos = @nextpos 
    END 
    RETURN 
END 

¿Alguien me puede ayudar a perfeccionar esto para satisfacer mis necesidades? Lo siento si mi pregunta no es muy clara, ya que estoy luchando para entenderlo.


EDIT 2: Después de hacer un poco más de lectura sobre el tema parece que necesito un procedimiento almacenado para hacer esto. El código arriba parece ser lo que necesito, pero tengo problemas para adaptarlo a mis necesidades. La estructura de la tabla es la siguiente:

application_id name     location_id 
------------------------------------------------------ 
1    Joe Blogs    34 
2    John Smith   55 

De acuerdo con el artículo que acabo vinculado a:

"La forma correcta de manejar la situación es utilizar una función que desempaqueta la cadena . a continuación, en una tabla es un ejemplo muy simple función:"

por lo tanto, parece que necesito para descomprimir estos valores en una cadena y pasarlas por el uso de este procedimiento almacenado edure. ¿Alguna idea sobre cómo puedo hacer que esto funcione?

EDIT 3: He logrado resolverlo usando charindex() y convert(), mientras los configuro en la parte superior. Gracias por toda su ayuda y me disculpo nuevamente por ser un dolor.

+0

Al publicar la definición de la tabla y algunas filas de ejemplo, las consultas y las respuestas esperadas mejorarían la calidad de las respuestas. – Andomar

+0

Disculpas por no dar una explicación completa, solo estoy experimentando un par de dificultades técnicas mientras estoy trabajando mi cerebro con este problema. –

+0

Aún no está claro cuál es el problema. ¿El problema es que no puedes hacer lo que quieres hacer (por qué no puedes simplemente crear la instrucción IN en el código de la entrada del usuario?) O ¿te preocupan los problemas de seguridad que plantea el artículo vinculado? Solo me preocuparía esto último si se trata de una aplicación que se encuentra en Internet. –

Respuesta

17

uso en la forma siguiente:

location_id IN ('2', '3', '4', '5') 
0

Puede utilizar una cláusula IN de la siguiente manera: -

SELECT DISTINCT name, location_id, application_id FROM apps 
WHERE ((application_id is null) or (application_id = '4')) 
AND ((location_id is null) or (location_id in ('2', '3', '4', '5'))) 
3

no estoy segura de haber entendido el "EDITAR" parte de su pregunta correcta, ¿pero te refieres a algo como esto?

SELECT DISTINCT name, location_id, application_id 
FROM apps 
WHERE location_id IN 
(
    SELECT id FROM other_table 
) 

EDIT:
Ahora que leí su segunda edición, todavía no estoy seguro si entiendo lo que quiere realmente hacer.

Por supuesto, podemos ayudarle con su procedimiento almacenado, pero hay una cosa que no es muy claro para mí:

¿Quiere que le ayudemos a crear el SP?
¿O realmente quieres hacer otra cosa, pero piensas que debes hacerlo creando un SP porque el enlace lo dice?

¿Puede especificar cómo se ve el resultado esperado?

+0

Sí, me gustaría ayuda con el SP. Para esta secuencia de comandos, me gustaría que busque todos los id_de_la_ ubicación si no se sugiere ninguno, lo que significa que tendría que tomarlos dentro de la columna y ponerlos en práctica. Por ejemplo, si buscaba a un hombre llamado Joe King y no se especificaba location_id, la declaración de selección buscaría usando todos ellos. –

Cuestiones relacionadas