Вопрос

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

Образец:

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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top