SQL в пункте с фиктивными рядами
-
01-10-2019 - |
Вопрос
Мне действительно хотелось знать, можно ли сделать выберите оператор, который возвращает ровно же записи, которые мы вложили в в пункт?
Образец:
select * from table
where table_id in (1, 2, 3, 666);
Эта таблица для примера имеет только ID-S от 1 до 100, поэтому этот выбор вернет только три строки. Что мне нужно сделать, чтобы получить один (вероятно, нулевой или манекен) ряд на 666?
Спасибо!
Решение
Вы могли бы использовать Союз:
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;
это то, как вы могли бы сделать это в Oracle. То from dual
может варьироваться в зависимости от какой системы базы данных вы используете.
Просто имейте в виду, что если вы используете Union, ваш фиксирующий запрос должен выбрать те же записи, что и настоящий запрос.
Другие советы
Вы можете выбрать без таблицы
Просто сделайте союз с вашим запросом
select table_id, some_column from table
where table_id in (1, 2, 3, 666);
union
select 666, 'dummy_data'
Предполагая таблицу numbers
Содержащие все номера, скажем, от 1 до 1000000 (на самом деле достаточно, чтобы ваш диапазон входных значений покрыт), вы можете запустить следующие SQL:
SELECT *
FROM numbers left outer join table on table.table_id = numbers.number
WHERE numbers.number in (1, 2, 3, 666)
Если вы используете СУБД, который предлагает лучшее решение, например, например, SQL в любом месте с этим sa_rowgenerator. Процедура, вы можете заменить таблицу numbers
с вызовом процедуры и не имеют предела максимального количества.
IN
Пункт является логическим предикатом, поэтому вам нужно заменить его с фиктивной записью:
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
В SQL Server 2008
, вы можете запустить этот запрос:
SELECT *
FROM @mydata d
LEFT JOIN
mytable t
ON t.id = d.id
с участием @mydate
это таблица переменной, передаваемой в виде параметра от клиента.
В PostgreSQL
, вы можете запустить этот запрос:
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
куда :arr
это массив [1, 2, 3, 666]
, также передан от клиента в качестве параметра.
В Oracle
, ты можешь сделать:
SELECT *
FROM TABLE(:mycol) q
LEFT JOIN
mytable t
ON t.id = q.id
, куда :mycol
является переменной типа коллекции, передаваемых от клиента.
Один из способов думать о нем: вам нужно будет иметь эти данные «вводить» запрос в качестве набора данных. Данные, найденные в том, где пункты никогда не «добавляются» к запросу, они используются только для фильтрации существующих данных.
Быстрый пример:
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