2013-05-16 3 views
2

Это вполне возможно сделать ЗЕЬЕСТ следующим образом:SQL «массивов» для многократного использования с сравнениями

SELECT * 
FROM orders 
WHERE order_id in (10000, 10001, 10003, 10005); 

Однако, можно создать переменную, которая хранит, что «массив» (10000,. ..) для многократного использования в нескольких заявлениях, подобных этому?

SELECT * 
FROM orders 
WHERE order_id in @IDarray; 

Извините, если это очень простой вопрос - мы все должны спросить их один раз!

Редактировать: Хм, возможно, я должен уточнить. В моей точной ситуации у меня есть загрузка идентификаторов (давайте использовать приведенный выше массив в качестве примера), которые жестко закодированы, но могут измениться.

Они должны быть повторно использованы для нескольких инструкций INSERT, чтобы мы могли вставлять вещи в несколько таблиц для каждого из ID. Два таких конечных результатов может быть:

INSERT INTO table1 VALUES (10000, 1, 2, 3); 
INSERT INTO table1 VALUES (10001, 1, 2, 3); 
INSERT INTO table1 VALUES (10003, 1, 2, 3); 
INSERT INTO table1 VALUES (10005, 1, 2, 3); 

INSERT INTO table2 VALUES (10000, a, b, c); 
INSERT INTO table2 VALUES (10001, a, b, c); 
INSERT INTO table2 VALUES (10003, a, b, c); 
INSERT INTO table2 VALUES (10005, a, b, c); 

Очевидно здесь возможность указать массив сохраняет номер, а также позволяет менять в одном месте вместо Вставки, имеющих быть изменены.

+0

Sql Server, например, поддерживает временные таблицы. –

+1

Если SQL Server видит каноническое [Массивы и списки в SQL Server] (http://www.sommarskog.se/arrays-in-sql-2008.html) –

+0

Какая СУБД вы используете? Postgres напрямую поддерживает это: 'where order_id = ANY (ARRAY [1,2,3])' –

ответ

1

С помощью Microsoft SQL Server можно использовать табличную переменную:

CREATE TABLE @IDTable(id INT PRIMARY KEY); 
-- insert IDs into table 

SELECT * 
FROM orders o 
INNER JOIN @IDTable i ON i.id = o.order_id; 

INSERT INTO table2 
SELECT id, 1, 2, 3 
    FROM @IDTable 

INSERT INTO table2 
SELECT id, 'a', 'b', 'c' 
    FROM @IDTable 
+0

Характеристика переменной таблицы, как в таблице «in-memory», близка к некорректной. Нет никакой гарантии, что переменная таблицы будет храниться в памяти, не более, чем есть гарантия, что на диск будет выведена временная таблица. –

+0

@Damien_The_Unbeliever Спасибо, я этого не знал. Я отредактировал свой ответ соответственно. –

+0

Я уточнил исходный вопрос - возможно, это может дать дополнительную информацию :) – Dan

0

При использовании переменной Declare таблицы вы можете достичь того, чего вы хотите сделать.

Например:

Declare @tbl table(orderID int,Orders varchar(max)); 

insert into @tbl 
SELECT * FROM orders WHERE order_id in (10000, 10001, 10003, 10005); 

Select orderID ,Orders from @tbl 
Смежные вопросы