SQL в предложении с фиктивными строками - PullRequest
1 голос
/ 27 августа 2010

Мне бы очень хотелось знать, возможно ли сделать оператор выбора, который возвращает точно такие же записи, которые мы вставили в в предложении?

Пример:

select * from table
where table_id in (1, 2, 3, 666);

Эта таблица для примера имеет только id-ы от 1 до 100, поэтому этот выбор вернет только три строки. Что мне нужно сделать, чтобы получить также одну (возможно, пустую или пустую) строку для 666?

Спасибо!

Ответы [ 5 ]

2 голосов
/ 27 августа 2010

Вы можете использовать союз:

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, ваш фиктивный запрос ДОЛЖЕН выбрать те же записи, что и реальный запрос.

2 голосов
/ 27 августа 2010

Вы можете выбрать без таблицы

Просто сделайте СОЮЗ с вашим запросом

select table_id, some_column from table
where table_id in (1, 2, 3, 666);
union
select 666, 'dummy_data'
1 голос
/ 27 августа 2010

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 - переменнаятип коллекции, переданный от клиента.

1 голос
/ 27 августа 2010

Предполагая таблицу 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)

Если вы используете СУБД, которая предлагает лучшее решение, например, e. г. SQL Anywhere с sa_rowgenerator процедурой, вы можете заменить таблицу numbers на вызов процедуры и не иметь ограничения максимального числа.

0 голосов
/ 27 августа 2010

Один способ думать об этом: вам нужно, чтобы эти данные «вводили» запрос как набор данных.Данные, в которых предложения никогда не «добавляются» в запрос, они используются только для фильтрации существующих данных.

Быстрый пример:

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
...