Oracle: разбить строку на строки - PullRequest
1 голос
/ 02 августа 2011

Давайте возьмем этот запрос:

WITH temp as SELECT '123455' colum from dual
SELECT * FROM big_table WHERE cod IN (SELECT colum from temp)
UNION ALL
SELECT * FROM big_table2 WHERE cod IN (SELECT colum from temp)

Я бы хотел найти список значений, а также найти один, но как я могу построить список строк без необходимостимного пишешь UNION?

Ответы [ 3 ]

3 голосов
/ 02 августа 2011

Если у вас есть доступный тип строковой таблицы, то следующий скрипт может делать то, что вы хотите

create table big_table
(
cod varchar2(4000)
);

create table big_table2
(
cod varchar2(4000)
);

insert into big_table (cod) values ('12345');
insert into big_table (cod) values ('12346');
insert into big_table (cod) values ('12347');

insert into big_table (cod) values ('12345');
insert into big_table (cod) values ('12348');
insert into big_table (cod) values ('12349');

--Example usage of the custom defined type stringarray
SELECT column_value from table(stringarray('12345','12348'));

WITH temp as (SELECT column_value from table(stringarray('12345','12348')))
SELECT * FROM big_table WHERE cod IN (SELECT column_value from temp)
UNION ALL
SELECT * FROM big_table2 WHERE cod IN (SELECT column_value from temp);

drop table big_table;
drop table big_table2;

Вы можете создать строковый тип как этот

CREATE OR REPLACE TYPE STRINGARRAY as table of varchar2(30)

Я надеюсь, чтоотвечает на ваш вопрос.

0 голосов
/ 02 августа 2011

Если вы ищете в нескольких таблицах, вы не сможете отказаться от использования UNION, если хотите сделать это за одну операцию набора.

В противном случае вы можете передать массив имен таблиц в цикл, просто динамически записать и запустить sql. Я бы предпочел сделать союзы лично ...

0 голосов
/ 02 августа 2011

Я не уверен, поддерживает ли Oracle это (или это именно то, о чем вы спрашиваете), но если это похоже на DB2, вы можете использовать свое Common Table Expression, чтобы создать свой список значений следующим образом ...

WITH temp (colum) as (VALUES '123456', '789012', '345678')
SELECT * FROM big_table WHERE cod IN (SELECT colum from temp)
UNION ALL
SELECT * FROM big_table2 WHERE cod IN (SELECT colum from temp)

Что касается того, что не нужно писать загрузку UNIONS, я не думаю, что есть лучший способ сделать то, что вы просите ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...