SQL en la cláusula con filas ficticias
-
01-10-2019 - |
Pregunta
Realmente me gustaría saber si es posible hacer una declaración de selección, que devuelve exactamente los mismos registros, que ponemos en cláusula?
Muestra:
select * from table
where table_id in (1, 2, 3, 666);
Esta tabla de ejemplo tiene sólo id-s de 1 a 100, por lo que este selecto volverá sólo tres filas. Lo que tengo que hacer, para llegar también uno (probablemente nulo o ficticio) seguidos por 666?
Gracias!
Solución
Se puede utilizar la unión:
select * from table
where table_id in (1, 2, 3);
union
select 666 as table_id, other_fields_with_dummy_values_in_table from dual;
es cómo podría hacerlo en Oracle. El from dual
puede variar dependiendo del sistema de base de datos que está utilizando.
Ten en cuenta que si se utiliza la unión, la consulta maniquí debe seleccionar los mismos registros que la consulta real.
Otros consejos
Se puede seleccionar sin una tabla
Sólo hacer una unión con la consulta ??p>
select table_id, some_column from table
where table_id in (1, 2, 3, 666);
union
select 666, 'dummy_data'
Suponiendo una numbers
tabla que contiene todos los números de, por ejemplo, de 1 a 1000000 (de hecho lo suficiente para que su rango de valores de entrada está cubierta), puede ejecutar el siguiente código SQL:
SELECT *
FROM numbers left outer join table on table.table_id = numbers.number
WHERE numbers.number in (1, 2, 3, 666)
Si utiliza un DBMS que ofrece una mejor solución, como el correo. sol. SQL Anywhere con su procedimiento sa_rowgenerator , que puede sustituir a la numbers
mesa con una llamada de procedimiento, y no tienen un límite de un número máximo.
cláusula IN
es un predicado booleano, por lo que tendrá que sustituirlo por un conjunto de registros dummy:
SELECT m.*
FROM (
SELECT 1 AS id
UNION ALL
SELECT 2 AS id
UNION ALL
SELECT 3 AS id
UNION ALL
SELECT 666 AS id
) q
LEFT JOIN
mytable m
ON m.id = q.id
En SQL Server 2008
, puede ejecutar esta consulta:
SELECT *
FROM @mydata d
LEFT JOIN
mytable t
ON t.id = d.id
con @mydate
es una variable de tabla, pasado como parámetro desde el cliente.
En PostgreSQL
, puede ejecutar esta consulta:
SELECT *
FROM (
SELECT :arr[s] AS id
FROM generate_series(1, array_upper(:arr, 1)) s
) q
LEFT JOIN
mytable t
ON t.id = q.id
donde :arr
es un [1, 2, 3, 666]
array, también pasado desde el cliente como el parámetro.
En Oracle
, que puede hacer:
SELECT *
FROM TABLE(:mycol) q
LEFT JOIN
mytable t
ON t.id = q.id
, donde :mycol
es una variable de tipo colección, transcurrido desde el cliente.
Una forma de pensar que es: que había necesidad de tener que los datos de "entrar" en la consulta como un conjunto de datos. Los datos publicados en donde no se "añaden" cláusulas a la consulta, sólo se utilizan para filtrar los datos existentes a cabo.
Un ejemplo rápido:
DECLARE @MustInclude (Value int not null)
INSERT @MustInclude (Value) values (1)
INSERT @MustInclude (Value) values (2)
INSERT @MustInclude (Value) values (3)
INSERT @MustInclude (Value) values (666)
SELECT *
from @MustInclude mi
left outer join MyTable mt
on mt.Value = mi.Value