values statement operator multiple framework sql sql-server tuples row-value-expression

statement - Usar tuplas en la cláusula SQL "IN"



where in entity framework (6)

¿Por qué no construir las instrucciones OR?

SELECT * FROM mytable WHERE (group_id = ''1234-567'' and group_type = 2) OR (group_id = ''4321-765'' and group_type = 3) OR (group_id = ''1111-222'' and group_type = 5)

Por supuesto, no se ve tan bonito y ordenado como el ejemplo de su concepto, pero hará el trabajo (y si tu IN con tuplas existiera, lo implementaría exactamente de la misma manera bajo las coberturas más probables).

Tengo una tabla que contiene los campos group_id y group_type y quiero consultar en la tabla todos los registros que tengan cualquier tupla ( id de grupo , tipo de grupo ) de una lista de tuplas. Por ejemplo, quiero ser capaz de hacer algo como:

SELECT * FROM mytable WHERE (group_id, group_type) IN (("1234-567", 2), ("4321-765", 3), ("1111-222", 5))

Ya se ha hecho una pregunta muy similar en: usando tuplas en la cláusula sql in , pero la solución propuesta allí supone que la lista de tuplas se debe obtener de otra tabla. Esto no funciona en mi caso, los valores de la tupla están codificados.

Una solución es usar concatenación de cadenas:

SELECT * FROM mytable WHERE group_id + STR(group_type, 1) IN ("1234-5672", "4321-7653", "1111-2225")

Pero el problema es que la tabla es bastante grande y hacer una concatenación de cadenas y conversiones para cada registro sería muy costoso.

¿Cualquier sugerencia?


Aquí hay otra solución de tupla que usa una combinación:

SELECT * FROM mytable m JOIN ( SELECT "1234-567" group_id, 2 group_type UNION ALL SELECT "4321-765", 3 UNION ALL SELECT "1111-222", 5 ) [t] ON m.group_id = t.group_id AND m.group_type = t.group_type


Dada una modificación muy pequeña (reemplazar las comillas dobles por una sola y agregar la palabra clave VALUES ), la sintaxis propuesta es la sintaxis estándar SQL-92 válida, es decir,

SELECT * FROM mytable WHERE (group_id, group_type) IN ( VALUES (''1234-567'', 2), (''4321-765'', 3), (''1111-222'', 5) );

Lamentablemente, MSFT no lo ha agregado a SQL Server y lo considera una característica ''no planificada'' .


En SQL Server 2008 puedes hacer esto:

select * from mytable as T where exists (select * from (values (''1234-567'', 2), (''4321-765'', 3), (''1111-222'', 5)) as V(group_id, group_type) where T.group_id = V.group_id and T.group_type = V.group_type )


Puede usar una expresión de tabla común para pretender que estas tuplas están en otra tabla:

;WITH Tuples as ( select ''1234-567'' as group_id, 2 as group_type union all select ''4321-765'', 3 union all select ''1111-222'', 5 ) SELECT * /* TODO - Pick appropriate columns */ from mytable m where exists ( select * from Tuples t where m.group_id = t.group_id and m.group_type = t.group_type)


Usando esa solución, esto debería funcionar:

SELECT * FROM mytable m WHERE EXISTS ( SELECT * FROM ( SELECT "1234-567" group_id, 2 group_type UNION ALL SELECT "4321-765", 3 UNION ALL SELECT "1111-222", 5) [t] WHERE m.group_id = t.group_id AND m.group_type = t.group_type)

Por cierto, probablemente deberías usar un CTE para crear esa tabla interna.